[英]Undefined behaviour (?) in C with char arrays
當我嘗試
char bla[32] = "foobar";
int i;
putchar(bla[i]);
當strlen(bla) < i < 32
, bla[i]
始終為\\0
。 但這實際上不是不確定的行為,應該避免嗎?
在C99標准的6.7.8節中,第21段規定:
如果用大括號括起來的列表中的初始化程序少於聚合中的元素或成員,或者用於初始化已知大小的數組的字符串文字中的字符少於該數組中的元素,則聚合的其余部分應與具有靜態存儲持續時間的對象一樣隱式初始化。
第10段指出,靜態算術類型(其中包括char)將初始化為零。
基於此,當使用字符串文字作為初始值設定項時,您應該期望將數組的其余部分初始化為零。
C89規范,第8.7節“初始化”:
如果數組的大小固定,則初始化程序的數量不能超過數組成員的數量; 如果較少,則尾隨成員將初始化為0。
因此,在您的用法中,尾隨的字符用零初始化。
初始化時,C語言遵循全有或全無的原則。 該對象要么完全未初始化,要么完全初始化。 后者意味着,如果您指定的初始化程序少於初始化整個對象所需的初始化程序,則編譯器會為您隱式初始化零對象的其余部分。
這適用於所有聚合類型。 在您的情況下,它恰好是用字符串文字初始化的字符數組。 例如,在這種情況下,
int a[100] = { 1 };
您將得到一個由100個int
的數組,其中第一個由1
初始化,其余設置為0
。
我認為這是定義明確的行為,實際上是一項功能。 只要您初始化數組或struct
中的一個元素,所有其余未明確初始化的元素都將初始化為0
。
數組未初始化部分的內容取決於它的位置(即,在哪個數據段上)。 如果它在堆棧上,則未初始化的元素是隨機值。 通常,如果是全局數組,則初始內容也是不確定的。 如果提供了static
規范,編譯器將在程序啟動時用零初始化其內容。
禁止訪問該未初始化的部分,並且不假定未定義的行為,但是結果可能是未定義的。 即使i > sizeof(bla)
也不訪問bla[i]
也是未定義的行為,因為您將擁有隨機值或分段錯誤異常。
它是未定義行為的事實意味着它可以執行任何操作。 每次都可能做同樣的事情,但是任何人都在猜測。
那不是編譯器的“功能”,而是有據可查的行為。 C編程語言不能保證未初始化變量的值。 因此,您只是在猜測我的價值,並且可以輕松訪問不屬於您的進程的內存,並且在Windows平台上,例如,這將導致Access Violation異常。 有關更多信息,請參見http://en.wikipedia.org/wiki/Uninitialized_variable 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.