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語言對數組不會進行越界檢查,所以編譯器並沒有報錯。