我用字符數組時,您必須在字符串+ 1帳戶的長度初始化大小爲\0
但如果我不考慮\0
和strchr如何要求這是否\0
是的char數組中,因爲我知道這種打印「是空終止」這個null是如何終止的?
char mark[4] = "mark";
if(strchr(mark, '\0')) {
puts("Is null terminated.");
} else {
puts("Is not");
}
我用字符數組時,您必須在字符串+ 1帳戶的長度初始化大小爲\0
但如果我不考慮\0
和strchr如何要求這是否\0
是的char數組中,因爲我知道這種打印「是空終止」這個null是如何終止的?
char mark[4] = "mark";
if(strchr(mark, '\0')) {
puts("Is null terminated.");
} else {
puts("Is not");
}
char mark[4] = "mark";
此行以上可以分割成兩部分:
char mark[4];
sprintf(mark,"mark");
第一行保留在存儲器4個字節,標記名稱將返回第一個字節的地址。
第二行(相當於mark =「mark」,但在執行過程中寫入)正在將字符串「mark」寫入內存,從名爲mark的地址開始,這裏的問題是,正在寫一個字符串,你會寫5個字節,所以你會寫4個字節保留給變量的4個字節AND將寫入一個NULL(0x00)到第5個字節,它不屬於變量!
如果你在mark變量之後分配了另一個變量,那麼當你寫入字符串時,它可能會破壞它,因爲它會侵入這個變量地址並覆蓋它。
'memchr(mark,0,sizeof mark)'而不是'strchr(mark,'\ 0')' – BLUEPIXY
對非空終止的字符串使用'strchr'是未定義的行爲,因爲它將繼續搜索直到它找到一個null。換句話說,它會在內存中保持快樂的壓縮狀態,直到它出現段錯誤或找到一個空值。 – Mgetz
有*無法保證*在標記[4]處有什麼值。如果它發生***是'\ 0',那麼你很幸運。但這不可靠。如果'mark [4]'中沒有終結符,那麼最終會由於偶然事件*而終止*(也許在'mark [245]'??)* *您最終會遇到「無效內存訪問」情況。 – abelenky