轉錄自 http://blog.xuite.net/csiewap/cc/16696000

動態配置二維陣列不外乎都是利用下面這種方式
int i;
int data_height, data_width;
int **data;
p = new int*[data_height];
for(i = 0; i < data_height; i++)
data[i] = new int[data_width];


可惜這種方式在釋放記憶體空間的時候就必須
for(i = 0; i < data_height; i++)
delete [] data[i];
delete [] data;


不是很方便,且不能使用
memset(data[0], 0, sizeof(int)*data_height*data_width);
初始值為 0
以及用 memcpy() 複製值至另一個陣列

因此參考了程式設計俱樂部 記憶體配置問題 此篇文章
改寫原本用 malloc 動態配置二維陣列的方式
使用 new 的方式建立二維陣列
void* new2d(int h, int w, int size)
{
register int i;
void **p;

p = (void**)new char[h*sizeof(void*) + h*w*size];
for(i = 0; i < h; i++)
{
p[i] = ((char *)(p + h)) + i*w*size;
}
}


因此就可以用這 function
動態建立二維陣列
data = (int **)new2d(data_height, data_width, sizeof(int));

為了增加閱讀方便,以及撰寫程式的方便
在程式前頭增加
#define NEW2D(H, W, TYPE) (TYPE **)new2d(H, W, sizeof(TYPE))

便可簡化剛剛動態配置二維陣列寫法
data = NEW2D(data_height, data_width, int);

此外此種動態配置記憶體的方法在釋放記憶體也比之前寫法方便多
delete [] data;
就可以釋放記憶體

arrow
arrow
    全站熱搜

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