[英]Array of zero size?
通常,我們以以下格式聲明數組:
DataType array_name[SIZE];
所以如果我嘗試為例如創建0長度數組
int arr[0]; //Line#1
arr[0] = 5; //Line#2
執行上面的代碼時我沒有收到任何錯誤。在這種情況下,是否為單個整數分配了內存?
為什么Line#1不會產生任何編譯錯誤?
理想情況下,應該!
在本地存儲上創建大小為0
的數組不是合法的代碼。
理想情況下,編譯器應該向您發出錯誤消息,可能是某些編譯器擴展允許它編譯,但按照標准,這不是有效的-pedantic
。請嘗試使用-pedantic
編譯。
參考:
C ++ 03標准8.3.4 / 1:
如果存在_constant-expression +(5.19),則它應為整數常量表達式,並且其值應大於零。
進一步,
為什么Line#2不會產生任何編譯錯誤?
因為超出分配數組范圍的寫入操作是Undefined Behavior 。 未定義行為不需要編譯器為您提供任何診斷。 請注意,一旦代碼表現出未定義的行為,任何事情都可能發生,所有的賭注都將關閉。
您不會得到任何錯誤,因為C / C ++不會對數組進行任何范圍檢查。 arr[10000000]
也不會給您編譯錯誤。
發生的情況是,您正在將某些內存寫入不屬於arr
的堆棧中的某些位置,並且誰知道會發生什么。 這可能會導致訪問沖突並崩潰或隨機破壞某些其他數據結構。
那是緩沖區溢出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.