如何以動態記憶體配置建立多維陣列??
在C/C++中,是無法直接動態配置多維陣列的,所有動態配置在heap中的記憶體,不論是資料型態都必須是一維陣列。
首先,先建立一個一維的指標陣列,然後為陣列中每一個指標配置一個一維的陣列,如此,就可以建立動態的多維陣列。
如要動態配置一個m * n的二維陣列:
int **ptr = NULL; ptr = new int[m]; for(int i(0); i < m; i++) ptr[i] = new int[n];我們實際是建立多個一維陣列,所以不能直接用delete []ptr; 來進行記憶體歸還的動作,因為這樣實際上只會刪除指標陣列,而實際儲存資料的一維陣列仍然存在,正確的方式是由上而下建構,由下而上解構:
for(int j(0); j < m; j++) delete []ptr[j]; delete []ptr;先歸還各個實際儲存資料的一維陣列,然後再將指標陣列刪除。
但建構過程中額外消耗的記憶體也越多,因為每一個階層需要建立一個指標陣列,因此如果以多維陣列儲存細小資料,記憶體的使用效率將會十分的低。
EX: 建立一個x * y * z的三維陣列
BYTE ***ptr = NULL; // Constructure... ptr = new BYTE **[x]; for(int i(0); i < x; i++) { ptr[i] = new BYTE *[y]; for(int j(0); j < y; j++) ptr[i][j] = new BYTE[z]; } // .... // Destructure... for(int m(0); m < x; m++) { for(int n(0); n < y; n++) delete []ptr[m][n]; delete []ptr[m]; } delete []ptr;以上是在C++中的寫法;介紹一個C的寫法。
EX: 在C中配置一個5 * 4的陣列
int **ptr = NULL; ptr = (int **)calloc(5, sizeof(int) * 4); for(int i = 0; i < 5; i++) ptr[i] = (int *)calloc(4, sizeof(int)); // .... for(int j = 0; j < 5; j++) free((void *)ptr[j]); free((void *)ptr);
沒有留言:
張貼留言