[英]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.