如願生長我有以下片的示例代碼分配1D陣列:內存大小與動態2D存儲器分配
#define C 3
int main() {
int *a;
long long N = 1000000000, i;
a = (int*)malloc(sizeof(int) * N * C);
for (i = 0; i < N * C; i++)
a[i] = i/2;
printf("%d\n", a[N*C - 1]);
return 0;
}
上述代碼恰恰12 GB的數據在存儲器中。請注意0和sizeof(int*) == 8
。
現在,如果我使用以下代碼實現動態2D陣列:
#define C 3
int main() {
int **a;
long long N = 1000000000, i;
a = (int**)malloc(sizeof(int*) * N);
for (i = 0; i < N; i++)
a[i] = (int*)malloc(sizeof(int) * C);
for (i = 0; i < N; i++)
for (j = 0; j < C; j++)
a[i][j] = i;
printf("%d\n", a[N-1][C-1]);
return 0;
}
上面的代碼奇怪需要的存儲器約38 GB(雖然它應該採取12GB + 8GB(用於指針的數組) = 20 GB。
奇怪的是,在第二個範例,如果我增加C
值到4,5,6,所消耗的存儲器是完全一樣的(38 GB),而對於C=7
和C=8
存儲器消耗的是54 GB,而C=16
消耗的內存是86 GB,這個d不適合任何我能想出來的數學。任何人都可以幫我解決這個問題嗎?
塊大小'malloc'(大多數分配器)給8首或24個字節**至少**給出尺寸。 – Jarod42
首先,這似乎不是C++代碼。其次,你如何衡量使用過的內存? – SergeyA
'int **'不是一個二維數組,它甚至不能指向這樣一個數組。 – Olaf