簡體   English   中英

C中的Malloc和數組索引混淆

[英]Malloc and array index confusion in C

我試圖掌握C中的malloc函數,並編寫了以下代碼:

int i;

int *arr = (int*)malloc(5*sizeof(int)); 

if(arr==NULL){

  printf("Failed to allocate memory for arr...\n");
  exit(1);

}

我認為這意味着只有5個元素可以添加到數組中。 為了測試這是否屬實,我添加了以下代碼:

arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
arr[4] = 5;
arr[5] = 6;
arr[6] = 7;
arr[7] = 8;
arr[8] = 9;

for(i=0;i<9;i++){

    printf("%d\n",arr[i]);

}

令人驚訝的是,該代碼編譯並運行完美。 怎么可能?

C不強制執行任何數組邊界檢查,因此當您請求5個整數的空間時,您使用了更多。

事實上,你覆蓋了4個真正沒有為你的特定用途預留的內存位置。 你的程序經過了為你的數組預留的內存區域,並開始將值存儲在分配區域之外的內存中。

事實上,這種“有效”只是純粹的運氣而不是依賴於它。 它可能在接下來的100次工作,或者下次嘗試時可能會失敗,很可能是“分段錯誤”消息。

防御性編程,就像你通過明智地檢查malloc的返回值,注意負責邊界檢查,編譯啟用了高警告級別的代碼等等,是防御這些錯誤的一些最好的防御。 其他工具,如valgrind ,lint類型的檢查器也可以提供幫助,但最終還是取決於你。

C的最大優勢之一,它自由地做各種各樣的事情,低級和高級,也是IMO最大的弱點之一。 如果Java是沃爾沃,那么C或許更像是法拉利,有時候會有不穩定的突破:)

C不進行邊界檢查。

怎么可能?

你正在寫過數組的末尾。 不會導致程序崩潰 (立即),因為在C中沒有邊界檢查,但是,如果你寫得足夠遠,它最終會導致錯誤。 有時您可能會寫出數百個int值,有時您可能無法編寫任何額外的值。

計算機中的內存基本上是按順序排列的。 你讓malloc給你一小段記憶 - 足夠5個整數。 計算機中可用的內存肯定比分配長度為5的數組要多。所以如果你寫入或讀取arr[8] ,你就會在內存中寫入其他內容。

通常,現代計算機有如此多的內存,你可能正在寫一些未使用的地方。 但偶爾,你會不小心覆蓋其他一些malloc數據。

請注意, 有時您的程序會崩潰(如您所料)。 這是因為您可能嘗試在分配的內存之外寫入,該地址不再有效。 您的操作系統通常會捕獲並崩潰您的程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM