根據聲明int** test;
,test
是pointer to pointer,代碼片使用malloc函數動態地爲int值矩陣分配內存。
聲明:
test = (int **)malloc(k * sizeof(int*));
// ^^------^^-------
// allocate for k int* values
繼續分配內存k
指針爲int(int*
)。因此,假設如果k = 4
那麼你得到這樣的:
temp 343 347 351 355
+----+ +----+----+----+----+
|343 |---►| ? | ? | ? | ? |
+----+ +----+----+----+----+
我假設地址是四個字節和?
意味着垃圾值。
temp
由malloc變量賦值的返回地址,malloc分配繼續內存塊的大小= k * sizeof(int**)
這是在我的例子= 16字節。
在for循環中,爲k
int分配內存,並將返回的地址分配給temp[i]
(以前分配的數組的位置)。
test[i] = (int*)malloc(k * sizeof(int)); //Initialize all the values
// ^^-----^^----------
// allocate for k int values
注:表達temp[i]
== *(temp + i)
。所以在每個迭代循環中,您對於k int類型的數組,看起來像下面分配內存:
First malloc For loop
--------------- ------------------
temp
+-----+
| 343 |--+
+-----+ |
▼ 201 205 209 213
+--------+ +-----+-----+-----+-----+
343 | |= *(temp + 0) | ? | ? | ? | ? | //for i = 0
|temp[0] |-------| +-----+-----+-----+-----+
| 201 | +-----------▲
+--------+ 502 506 510 514
| | +-----+-----+-----+-----+
347 |temp[1] |= *(temp + 1) | ? | ? | ? | ? | //for i = 1
| 502 |-------| +-----+-----+-----+-----+
+--------+ +-----------▲
| | 43 48 52 56
351 | 43 | +-----+-----+-----+-----+
|temp[2] |= *(temp + 2) | ? | ? | ? | ? | //for i = 2
| |-------| +-----+-----+-----+-----+
+--------+ +-----------▲
355 | |
| 9002 | 9002 9006 9010 9014
|temp[3] | +-----+-----+-----+-----+
| |= *(temp + 3) | ? | ? | ? | ? | //for i = 3
+--------+ | +-----+-----+-----+-----+
+-----------▲
再次?
意味着垃圾值。
其他景點:
1)您是鑄造malloc返回地址,但在C,你應該避免。閱讀Do I cast the result of malloc?只是做如下:
test = malloc(k* sizeof(int*));
for (i = 0; i < k; i++){
test[i] = malloc(k * sizeof(int));
}
2)如果你是動態分配的內存,你需要釋放內存明確,當你的工作與完成(釋放動態分配的內存,你不能訪問內存)之後。步驟來釋放內存test
將如下:
for (i = 0; i < k; i++){
free(test[i]);
}
free(test);
3)這是,如果你想完全分配的二維矩陣分配內存數組的數組的一種方式繼續存儲所有陣列檢查這個答案:Allocate memory 2d array in function C
4)如果說明幫助和你想學習的3D分配入住這樣的回答:Matrix of String or/ 3D char array
我希望你的老師還展示瞭如何分配multidimenional陣列中的所有自然地打造成了語言,沒」向你展示2D的這個模擬,作爲第一個需要注意的地方和數組和指針。但無論如何,他向你展示了許多令人f目結舌的代碼:在C語言中,你不會施加「malloc」的返回值,並且無論如何你都不會教任何人在語言理解的早期階段使用強制轉換。 –