我沒有明確的想法如何以下兩件代碼顯示不同的行爲:這個c代碼中的這個奇怪的行爲是什麼?
代碼:
#include <stdio.h>
void set(char** addr) {
char* str = "testa";
*addr = str;
}
void _set(char*** addr) {
char* arr[] = {"testb"};
*addr = arr;
}
int main() {
char* a;
set(&a);
printf("'%s'\n", a);
printf("'%s'\n", a);
char** b;
_set(&b);
printf("'%s'\n",b[0]);
printf("'%s'\n",b[0]);
}
輸出:
testa
testa
testb
testb
當我刪除第一位的testa部分,代碼是:
void _set(char*** addr) {
char* arr[] = {"testb"};
*addr = arr;
}
int main() {
char** b;
_set(&b);
printf("'%s'\n",b[0]);
printf("'%s'\n",b[0]);
}
輸出:
'testb'
'UH▒▒AWE1▒AVAUATSH▒▒8▒E▒'
你回國(而不是返回值而是通過參數)一個指向局部變量的指針。這足以將周圍的一切都考慮在內......未定義的行爲。 –
我建議你閱讀一本很好的C書,並且好好思考一下究竟是什麼指針。考慮變量的生命週期。 – orlp