我此刻再學習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