我此刻再学习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
的地方。
为什么会发生这种情况的任何解释?
没有通通过在C基准,只按值传递。 – ericbn
您正在将函数内部的一个指针传递给本地变量('tester')给它的调用者。这是一面红旗。你正确地使用了传递引用,但是你通过引用传递的值指向堆栈中的回收内存,所以指向''second''的指针的地址被'0'偷偷地覆盖。 – mooiamaduck
@Gopi Ref。 [Call By Value](https://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_value) – user2864740