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但這個方法每次分配指...