1. 程式人生 > >while迴圈與字串奇怪的bug

while迴圈與字串奇怪的bug

今天程式設計的時候遇到一個問題,以前沒有遇到過,做個記錄:下面是我寫的一個小的測試程式

#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還指向原字串首部,

需要一個臨時變數儲存該地址。