C語言的二維和三維動態連續陣列分配

2021-07-04 18:27:05 字數 2224 閱讀 6584

本測試純粹為了學習研究,沒有意思去比較c和c++的優劣,或者和其他語言的優劣,因為比起c++,我更喜歡c,因為嵌入式的程式還是用c效率高,雖然程式設計有點虐心,,,,

在影象處理領域,有時需要動態分配一段記憶體用於儲存影象,大家都知道影象在記憶體中儲存形式都是以連續的一維陣列的形式存放,故平常使用就分配一維空間就夠了;

可是當我需要處理高維資料時,比如做積分圖,積分直方圖,還沿用一維的陣列形式在程式設計時的定址就比較虐心了,所以還是有必要動態分配高維的陣列的。

分配前提:分配的空間必須時連續的,也就是從高維向低維變換時,必須可以在一段連續的空間之內按照固定的索引方式能夠正確的定址

前維度×

上一層維

度 的指標陣列,直到最後一維直接分配足夠覆蓋所有維度的長度的儲存空間,然後從高維開始,逐級將其首位址鏈結起來,最後得到的就是連續的動態陣列,,,,,

二維太簡單,以三維說事兒,假如要分配ro

w×co

lcha

nnel

的空間,過程就是:

1. 先分配ro

w 個二維指標,即乙個三維指標陣列;

2. 再分配ro

w×co

l 個一維指標,即乙個二維的指標陣列;

3. 然後分配ro

w×co

l×ch

anne

l 個資料單元,即乙個一維的指標,指向乙個一維陣列;

4. 最後從高維ch

anne

l 開始,逐級向下,將其再固定的位置,由低維的指標指向對應的元素,直到最後的ro

w 的那一級;

5. 釋放的時候,遵循先釋放高維,再釋放低維的順序,逐級釋放;

更高維的動態陣列分配依此類推

語言表達能力有限,不知看懂沒有,假如已經看暈,就向下直接看**吧,一看就懂了,o(∩_∩)o

/**

* @brief alloc a 2d int array

* @param col

* @param row

* @return int

*/int **array2di(int row, int col)

/**

* @brief free a 2d int array

* @param array

*/void arrayfree2di(int **array)

return;

}

/**

* @brief alloc a 3d int array

* @param row

* @param col

* @param channel

* @return int

*/int ***array3di(int row, int col, int channel)

/**

* @brief free a 3d int array

* @param array

*/void arrayfree3di(int ***array)

return;

}

為使得結果更直觀,我呼叫了分配unsigned char型別的函式,每個資料佔乙個位元組,這樣位址就是連續的,便於觀察

縱向看第一列,可以發現,的確是3行,4列,每乙個元素有5個通道,大小沒錯;

再看位址,從第乙個元素到最後乙個,都是連續的,也沒有問題;

再看長度,3*4*5=60,的確有60個元素;

當釋放空間之後,編譯器給出錯誤資訊,說明空間的確釋放掉了。

c 定義動態二維陣列和三維陣列

推薦使用 vectorint array m,vector int m 定義m行n列二維陣列二維陣列本身相當於是一維陣列下儲存指標,可以用new int m 定義一維陣列,但是不能定義new int m n 定義m行n列陣列 int array new int m for int i 0 i n i...

C語言基礎 二維陣列,三維陣列

一 二維陣列 1.二維陣列的定義 資料型別 陣列名 行 列 2.二維陣列有幾行,就代表有幾個一維陣列.int a 2 3 a 0 對應的元素是1,2,3 二維陣列的元素也是通過下標來訪問的,行和列的下標都是從0開始的,a 0 0 表示陣列a的第乙個元素.3.二維陣列的元素的個數 行數 列數 4.二維...

C 中動態定義一維陣列,二維陣列,三維陣列

動態定義一維陣列 二維陣列 三維陣列 include includeusing namespace std int main int hight row col register int i j k srand unsigned time null cout 動態定義一維陣列 int p1 p1 n...