動態分配二維陣列

2021-06-29 03:41:48 字數 1599 閱讀 2643

最近做的乙個東西需要動態分配大空間的二維陣列,然後進行整塊記憶體(緩衝區 buffer)的操作,出現了二維陣列空間不連續的問題。

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

int **p=null; 

p=new int*[nwidth];

if (!p)

for (int j=0;j這段**淺顯易懂,先分配第1維,在迴圈分配第2維。假設二維陣列是3×2的,每一句執行完後的記憶體情況如圖所示(方格表示記憶體,xx表示隨機數。下面是記憶體位址。當然,這個位址是個示意,事實不會分配到那的。):

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

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

這樣分配的記憶體需要迴圈釋放。

對這個方法有一改進,如下:

int **p=null; 

p=new int *[nwidth];

if (!p)

p[0]=new int[nwidth*nheight];

if (!p[0])

zeromemory(p[0],nwidth*nheight*sizeof(int));

for (int i=1;i

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

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

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

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

if(!p)

delete p[0];

p[0]=null;

delete p;

p=null;

動態分配二維陣列

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