2017-05-19 24 views
-1

我用字符數組時,您必須在字符串+ 1帳戶的長度初始化大小爲\0
但如果我不考慮\0和strchr如何要求這是否\0是的char數組中,因爲我知道這種打印「是空終止」這個null是如何終止的?

char mark[4] = "mark"; 
if(strchr(mark, '\0')) { 
    puts("Is null terminated."); 
} else { 
    puts("Is not"); 
} 
+0

'memchr(mark,0,sizeof mark)'而不是'strchr(mark,'\ 0')' – BLUEPIXY

+5

對非空終止的字符串使用'strchr'是未定義的行爲,因爲它將繼續搜索直到它找到一個null。換句話說,它會在內存中保持快樂的壓縮狀態,直到它出現段錯誤或找到一個空值。 – Mgetz

+2

有*無法保證*在標記[4]處有什麼值。如果它發生***是'\ 0',那麼你很幸運。但這不可靠。如果'mark [4]'中沒有終結符,那麼最終會由於偶然事件*而終止*(也許在'mark [245]'??)* *您最終會遇到「無效內存訪問」情況。 – abelenky

回答

2

strchr不限於,甚至都不知道你傳遞給它的數組,長度,所以將繼續在整個內存誓不罷休它發現它在尋找什麼。

如果您打印strchr返回的值,您會看到它超出了數組的末尾。

+0

我只是在將它改爲'if((p = strchr(mark,'\ 0'))後得到一個空行){ \t \t printf (「%s \ n」,p); \t} @ – Mark

+0

@Mark:正如你應該有的;畢竟,「p」指向一個空字節。 – jwodder

+1

@Mark使用'%p'而不是'%s',你想要的是指針值,而不是字符串值 – Mgetz

0
char mark[4] = "mark"; 

此行以上可以分割成兩部分:

char mark[4]; 
sprintf(mark,"mark"); 

第一行保留在存儲器4個字節,標記名稱將返回第一個字節的地址。

第二行(相當於mark =「mark」,但在執行過程中寫入)正在將字符串「mark」寫入內存,從名爲mark的地址開始,這裏的問題是,正在寫一個字符串,你會寫5個字節,所以你會寫4個字節保留給變量的4個字節AND將寫入一個NULL(0x00)到第5個字節,它不屬於變量!

如果你在mark變量之後分配了另一個變量,那麼當你寫入字符串時,它可能會破壞它,因爲它會侵入這個變量地址並覆蓋它。