while迴圈與字串奇怪的bug
阿新 • • 發佈:2019-02-20
今天程式設計的時候遇到一個問題,以前沒有遇到過,做個記錄:下面是我寫的一個小的測試程式
#include <stdio.h> #include <string.h> int main(void) { char *str = "abcASJSJJ"; char *dst = "bc"; printf("%p %c\n", dst, *dst); /* while(*dst != '\0'){ */ /* printf("%c\n", *dst); */ /* dst++; */ /* } */ while((*dst++) != '\0'){ printf("1\n"); } printf("%c\n", *dst); printf("%p\n", &dst[0]); printf("%p\n", &dst[2]); printf("%p %c\n", dst, *dst); if(*dst == '\0') printf("true\n"); else printf("false\n"); return 0; }
注意上面的while迴圈,我的預期是要輸出true。你覺得會輸出什麼呢?
執行結果:
結果是false,而且為什麼最後*dst不是'\0',而是個隨機字元呢。還有首地址已經改變了
通過gdb除錯,主要原因就在於while迴圈那一句,dst++執行了三次,dst已經指向了字串'\0'的下一個字元,是一個
沒有定義的記憶體,值是隨機的。
修改方法就是替換成程式碼中註釋的部分。就可以得到預期的結果了。當然dst的地址都改變了,如果想dst還指向原字串首部,
需要一個臨時變數儲存該地址。