稍微紀錄一下不然怕自己忘記
學習C/C++ 時一定學過如何動態分配記憶體 malloc/free 與 new/delete
C語言中沒有真正的多維陣列,是用一維陣列去模擬
二維陣列的兩種寫法:
第一種scattered dynamically allocated 2D array
/* allocate */
int **array2D = (int**)malloc(num_rows * sizeof(int*));
for (i = 0; i < num_rows; i++)
array2D[i] = (int*)malloc(num_colums * sizeof(int));
return array2D;
/* free*/
for (i = 0; i < num_rows; i++)
free(array2D[i]);
free(array2D);
這種做法是一邊申請一邊分配,寫法比較易懂,但是其實這樣分配下記憶體空間是不連續的
並且要釋放空間時必須知道array大小利用迴圈進去逐一釋放
第二種one-piece dynamically allocated array
/* 2D allocate */
/* num_rows 跟 num_columns就是二維陣列的列數跟行數 */
int **array2D = (int**)malloc(num_rows * sizeof(int*));
int *p = (int*)malloc(num_rows * num_columns * sizeof(int));
for (i = 0; i < num_rows; i++)
array2D[i] = p + i * num_columns; /* 每一列的長度就是有幾column個元素 */
/* 2D free */
free(p);
free(array2D);
/* 3D allocate */
/* d1 d2 d3 是三個維度,先是切面,再來是每一面的列數,再來是每一列的元素個數 */
int ***array3D = (int***)malloc(d1 * sizeof(int**));
int **pp = (int**)malloc(d1 * d2 * sizeof(int*));
int *p = (int*)malloc*d1 * d2 * d3 * sizeof(int));
for (i = 0; i < d1; i++)
{
array3D[i] = pp + i * d2;
for (j = 0; j < d2; j++)
array3D[i][j] = p + j * d3;
p = p + d2 * d3;
}
return array3D;
/* 3D free */
/* 最好可以先用if確認指標是否為空 */
free(**array3D);
free(*array3D);
free(array3D);
第二種做法是先申請空間後分配,寫法比較不直觀,但是記憶體空間是連續的
可以利用printf(%p) 去列印地址
缺點是如果陣列非常大,記憶體不見得都有足夠大的連續空間
使用之前可先確認是否allocate成功
這種做法釋放空間時不需知道大小,只要利用當初宣告的指標去釋放
原則就是最外層的最後釋放
- Oct 01 Thu 2020 05:37
C語言動態分配多維陣列
文章標籤
全站熱搜
留言列表