動態配置二維陣列不外乎都是利用下面這種方式
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;
    }

    return p;
}


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


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

更新記錄:
2011/01/22 01:07

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


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

arrow
arrow
    全站熱搜

    smalldd 發表在 痞客邦 留言(2) 人氣()