c - 陣列教學 - 陣列英文




C陣列分段僅在一定的閾值之後出現故障 (3)

這在我看來似乎是由malloc完成的某種額外的填充。

你沒有調用malloc()。 你在堆棧內存中聲明a一個3個整數的數組,而malloc()使用了堆內存。 在這兩種情況下,訪問最後一個元素(第三個元素,在這種情況下是a[2] )是未定義的行為。 當堆內存完成時,通常會導致分段錯誤。

我正在看這個簡單的程序。 我的理解是試圖修改超過最大索引的內存地址值應該導致分段錯誤。 但是,下面的代碼運行沒有任何問題。 我甚至可以打印出所有6個數組索引0-> 6

main()
{
  int i;
  int a[3];

  for(i=0; i<6; i++)
        a[i] = i;

}

但是,當我改變for循環

for(i=0; i<7; i++)

並執行該程序,它會segfault。 這在我看來似乎是由malloc完成的某種額外的填充。 為什麼只有第六指數(s + 6) 之後才會發生? 這種行為會發生更長/更短的數組嗎? 請原諒我的愚蠢作為低級java程序員:)


那麼, malloc沒有這樣做,因為你沒有調用malloc 。 我的猜測是,額外的三個寫入足以咀嚼你的幀指針和你的堆棧指針,而不是通過你的返回地址(但第七個命中)。 你的程序不能保證當你訪問越界內存時(儘管還有其他語言可以保證它),但不能保證不會崩潰。 這就是不確定的行為:不可預知的。


這取決於可用的空閒內存,如果空閒內存可用小於它會給分段錯誤,否則將使用額外的內存來存儲數據,它不會給分段錯誤。不需要malloc,因為數組本身分配記憶。

在你的系統中,內存只有6個整數,而當你試圖訪問下一個內存(這是不可訪問的或者說不是免費的)時,它給出了分段錯誤。







segmentation-fault