int main ()
{
/*
char a[] = "abc";
printf("strlen(a): %li", strlen(a));
printf("\nsizeof(a): %li", sizeof(a));
*/
char b[3];
printf("\nstrlen(b): %li", strlen(b));
printf("\nsizeof(b): %li", sizeof(b));
printf("\nb = ");
puts(b);
return 0;
}
當我運行上面的代碼時,它輸出以下內容:
長度(b):1
大小(b):3
乙 =
但如果我撤消評論,它會輸出:
鏈(一):3
大小(a):4
長度(b):6
大小(b):3
b = abc
為什么會發生這種情況?我希望能對它進行深入的解釋,如果可能的話,我會對其進行快速“修復”,這樣我就不會再遇到這個問題了。
總的來說,我是編程和 C 方面的初學者,根據我迄今為止學到的知識,這不應該發生
如果我違反了本網站的任何規則,謝謝和抱歉,我也是新來的!
uj5u.com熱心網友回復:
strlen(b)導致未定義的行為,因為陣列b未初始化。因此陣列的內容是不確定的。 strlen如果陣列的垃圾內容中碰巧有空位元組(充當空終止符),則可能回傳一個小數,如果陣列中沒有空位元組但記憶體中有一個空位元組與它相鄰,則可能回傳一個大數(訪問時碰巧不會崩潰),或者它可能會出現段錯誤,或者以其他一些不可預測的方式失敗。您觀察到的特定不當行為很容易取決于附近其他記憶體的內容,因此會受到添加或洗掉其他變數或以明顯不相關的方式更改周圍代碼的影響。
puts(b) 同樣是未定義的行為。
(另一個錯誤:sizeof與strlen兩者的回報size_t,為此,正確的printf格式說明%zu,不是%li這將是long int。)
我希望能對它進行深入的解釋,如果可能的話,我會對其進行快速“修復”,這樣我就不會再遇到這個問題了。
不要試圖讀取或使用尚未初始化的區域變數的內容。
另請參見C 中宣告的未初始化變數會發生什么?它有價值嗎?和(為什么)正在使用未初始化的變數未定義行為?.
如果您啟用編譯器警告,您的編譯器可以警告您有關此示例的某些實體,例如gcc 捕獲此示例。valgrind 之類的工具也可以提供幫助。
總的來說,我是編程和 C 方面的初學者,根據我迄今為止學到的知識,這不應該發生
相反,這種行為在 C 中極為常見。C 語言不保證對此類錯誤進行任何檢查,并且實作通常不提供它們。你應該習慣這樣一種可能性,即語言不會阻止你做一些錯誤的事情,而是會以不可預測的方式行為不端(或者更糟的是,似乎可以正常作業一段時間)。因此,在用 C 編程時,與使用“更安全”的語言相比,您必須更加小心和注意語言規則。對于初學者來說,這是一種艱難且不友好的語言。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/390709.html
