我现在正在重新学习 C,并在审查通过引用传递时编写了一小段测试代码:
#include <stdio.h>
#include <string.h>
void distort_flags_list(char*** flags);
int NUM_FLAGS = 2;
int main(int argc, char** argv)
{
distort_flags_list(&argv);
for (int flag_offset = 0; flag_offset < NUM_FLAGS; flag_offset++) {
printf("%s\n", *(argv + flag_offset));
}
return 0;
}
void distort_flags_list(char*** flags)
{
char* tester[2] = {"first", "second"};
*flags = tester;
}
我很好奇为什么在运行时会得到以下输出:
first
(null)
而不是打印“第一”和“第二”。根据我的理解,当将指向 argv
的指针传递给 distort_flags_list
时,您正在更改指针指向定义的 tester
地址的位置在那个函数中。
对为什么会发生这种情况有什么解释吗?
最佳答案
在函数 distort_flags_list
中,您将 *flags
的值设置为函数返回后无效的值。
在调用 distort_flags_list
之后访问 argv
中的任何内容是未定义的行为。
要确保值 *flags
在函数返回后继续有效,您需要使用动态内存分配。
void distort_flags_list(char*** flags)
{
*flags = malloc(2*sizeof(**flags));
(*flags)[0] = malloc(20); // Make is large enough
(*flags)[1] = malloc(20); // ditto
strcpy((*flags)[0], "first");
strcpy((*flags)[1], "second");
}
然后,添加代码以在 main
中释放内存。
int main(int argc, char** argv)
{
distort_flags_list(&argv);
for (int flag_offset = 0; flag_offset < NUM_FLAGS; flag_offset++) {
printf("%s\n", *(argv + flag_offset));
}
free(argv[1]);
free(argv[0]);
free(argv);
return 0;
}
关于困惑为什么通过引用传递 char** 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31529849/