C語言中二維數組動態分配內存

最近《數據結構》看到哈夫曼樹的構造一部分的程序,構造程序使用了鋸齒狀數組——即一種特殊二維數組,只不過每一行的長度是根據需要存放的元素個數分配的。這就涉及到二維數組內存的動態分配問題,先來看如何給一個普通的4行5列二維數組分配內存。
int **p;
int i;


if( NULL == (p = (int **)malloc(4 * sizeof(int *))) )
     return -1;


for(i = 0; i < 4; i++)
{
     if( NULL == (p[i] = (int *)malloc(5 * sizeof(int))) )
         return -1;
}
        
for(i = 0; i < 4; i++)
{
     free(p[i]);
}
free(p);


在C語言中二維數組其實是數組的數組。第5行給p分配了4個都爲指向int的指針大小的內存空間(對應着二維數組的行),然後第11行分別給每行都分配5個int大小的內存空間,這些內存空間在內存中都是線性排列的。
編譯器在處理如上代碼時,並不是真的就給每行分配5個int大小的內存空間,在gcc 4.7.2-2中,通常會多分配一個int大小的內存空間(如下圖所示)。而在VC6.0中會多分配14個。

gcc爲如上代碼中二維數組的內存分配情況如下圖:


後來不小心在程序中寫了類似與p[2][50] = 7;的代碼,這段代碼明顯數組越界了,但編譯器沒有報錯。一直在糾結爲啥會這樣,如果你看了上面那副圖你就知道了,其實這時p[2][50]雖然從你分配的內存空間中"越界",此時它用的是圖中最後的空白區域的某一塊內存,而C語言對數組不會進行越界檢查,所以編譯器並沒有報錯。


發佈了32 篇原創文章 · 獲贊 58 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章