最近做的乙個東西需要動態分配大空間的二維陣列,然後進行整塊記憶體(緩衝區 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但這個方法每次分配指...