2014-11-22 62 views
0

雖然我的數組只有大小3,並且我已經爲每個元素指定了一個char,但仍然會自動添加NULL Terminator。是什麼導致在我的代碼中添加NULL Terminator?C - 爲什麼在將單個字符分配給數組時,會自動添加字符串終止符?

int main(void) 
{ 
    char s[3]; 
    s[0] = 'f'; 
    s[1] = 'o'; 
    s[2] = 'o'; 

    int i = 0; 

    while (s[i] != '\0') 
     printf("%c", s[i++]); 

    printf("\n"); 

    if (s[i] == '\0') 
     printf("Null Terminator Added\n"); 
} 
+4

這只是一個不錯的行爲。在你的數組後面會出現一個0 *,但那只是運氣不好。 – 2014-11-22 19:21:29

+0

「什麼導致NULL代碼被添加到我的代碼中」 - 很可能是'i = 0'(儘管我期望它們之間有1個字節的間隔)。如果你想驗證''i',你可以檢查'&i',但是一般情況下,編譯器會在's'之後立即分配'i'。這只是一個運氣問題,至於在你的函數被調用的地方(在你的具體例子中它是'main',所以你應該在每次執行時都會得到相同的結果)執行時的堆棧內容。 – 2014-11-22 19:27:55

+0

如果你對C相對比較陌生,並且在數組和指針的工作方式方面存在問題,下面是一個幫助可視化差異的答案:http://stackoverflow.com/questions/27052988/what-is-the-difference-between -different-kinds-of-pointer-in-c/27054973#27054973 – technosaurus 2014-11-22 20:03:46

回答

3

它不是「自動添加」。當您嘗試訪問s[3]時,您正在訪問不屬於陣列s的內存。在你的機器上,看起來這個內存恰好包含一個空字節。你不能依賴這種事情發生;也許在另一臺機器上,或另一次運行,該內存將碰巧包含其他內容。或者,也許電腦會檢測到非法的內存訪問,並且你的程序會崩潰。或者,也許你的程序會以一些其他微妙和意想不到的方式打破。

簡短回答:你的程序是越野車,你不能真正從其行爲中得出任何有意義的結論。

相關問題