3.16.2010

[C/C++] 如何以動態記憶體配置二維陣列 (How to allocate Two-Dimensional Array by dynamic memory)??

其實這是之前在學習C和C++時遇到的問題。在實務上應該很少有人這樣用,大部份應該都只是運用一維的較多。當時也有把Google到的結果抄在書上,現在只不過是再把書上的東西抄來這理。

如何以動態記憶體配置建立多維陣列??

在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);

沒有留言:

張貼留言