二維陣列的動態分配

2021-06-16 17:59:11 字數 2001 閱讀 9474

1:使用malloc()進行分配

方法一:記憶體不連續    

假設陣列元素的資料型別是int型,則動態分配二維陣列的一般方法是這樣:

int **p = null; 

p = (int **)malloc(nwidth * sizeof(int *));

if (!p)

return null;

for (int j = 0; j < nwidth; j++)

這段**淺顯易懂,先分配第1維,在迴圈分配第2維。假設二維陣列是3×2的,每一句執行完後的記憶體情況如圖所示(方格表示記憶體,xx表示隨機數,方格下方是記憶體位址。當然,位址只是示意而已,與真實情況並不相符)

第一句完後分配了3個記憶體單元

迴圈分配後,注意下面3段記憶體通常是不連續的。這樣用下表p[n][m]運算元組沒問題,如果整塊記憶體操作就會有問題了,比如下面這句:

原意是想把下面的3塊6個記憶體單元清0,可是事與願違,把從p開始後面6個記憶體單元清0了,p不能用了。p後面只有3個已分配的記憶體單元,卻要操作6個,另外3個是未知區域。清了後面虛線的3塊未知區域,這就很危險了,可能導致程式崩潰。

這樣分配的記憶體需要迴圈釋放。**如下:

for (int j = 0; j < nwidth; j++)

free(p);

p = null;

方法二:記憶體連續

若要動態分配記憶體連續的二維陣列,那麼可以採用如下方法:

//p是乙個指向指標的指標

int **p = null;

//請求系統分配乙個包含nwidth個int*指標的空間,p指向空間的首位址。

//此空間用來作為二維陣列的索引

p = (int **)malloc(nwidth * sizeof(int *));

if (!p)//若malloc失敗

return null;

//請求系統分配乙個包含nwidth*nheight個int指標的空間,p[0]指向空間的首位址。

//此空間用來儲存二維陣列的資料

p[0] = (int *)malloc(nheight * nwidth * sizeof(int));

if (!p[0])//若malloc失敗

//索引與相應資料的關聯

for(int i = 1; i < nwidth; i++)

p[i] = p[i-1] + nheight;//留意並思考此處為什麼是直接加上nheight的值

memset(p[0], 0, nheight * nwidth);//二維陣列清零

這段**解決了分配的空間不連續的問題。每一句執行完後的記憶體情況如圖所示:

第一句和上面一樣。

這6個記憶體單元是一次分配的,所以連續。

這個二維陣列的資料首位址是p[0],p是第2維的索引首位址。所以如果要對二維陣列進行整體的記憶體(緩衝區 buffer)操作,要以p[0]為操作物件的首位址。

到此,索引與對應的資料位址關聯上了。這個二維陣列既可以通過下表p來操作,又可以操作緩衝區。操作緩衝區的函式比如memcpy,cfile的writehuge和readhuge使用起來很方便,省去了2次迴圈的麻煩。

至於釋放,不必迴圈釋放。因為malloc了2次,所以只需free兩次就行了:

free(p[0]);     //釋放二維陣列

p[0] = null;

free(p);        //釋放指標空間

p = null;

以上原文出自

2:使用new()進行分配

1) 先分配行指標位址

int** array2d = new int*[row];

2) 再為每一行分配空間

for(int i=0; i

array2d[i] = new int*[col];

也可以在此實現不等長的陣列空間分配

3) 先釋放每一行的空間

for(int i=0; idelete array2d[i];

4)釋放行指正陣列

delete array2d;

以上**

動態分配二維陣列

1.c語言動態分配二維陣列 1 已知第二維 code 1 char a n 指向陣列的指標 a char n malloc sizeof char m printf d n sizeof a 4,指標 printf d n sizeof a 0 n,一維陣列 free a 2 已知第一維 code ...

動態分配二維陣列

原文摘自 假設我需要乙個nrows ncolumns陣列,則可以用以下幾種方法動態分配空間 1.動態陣列的成員都可以用正常的陣列下標 array i j include include void main printf n free array 2.讓陣列的內容連續,但在後來重新分配列的時候會比較困...

動態分配二維陣列

眾所周知,每乙個二維陣列有n行個二級指標指向陣列的每一行,每一行有m個一級指標指向陣列的每乙個元素。因此,我們動態分配二維陣列只要分配n個二級指標,n m個一級指標就行了,先來看乙個常用的方法 int i,p int malloc row sizeof int for i 0 i但這個方法每次分配指...