稍微紀錄一下不然怕自己忘記
學習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成功
這種做法釋放空間時不需知道大小,只要利用當初宣告的指標去釋放
原則就是最外層的最後釋放

arrow
arrow
    創作者介紹
    創作者 Crystal 的頭像
    Crystal

    Crystal的部落格

    Crystal 發表在 痞客邦 留言(0) 人氣()