C語言兩種動態分配二維陣列方式的討論

2021-06-19 12:10:52 字數 1419 閱讀 1937

在c語言中,常常有這種情況,需要動態分配乙個根據實際需求情況的不確定大小的二維陣列。在這種情況下,常常以存放元素資料型別為字串的一維陣列(即存放元素資料 型別為字元型別的二維陣列)。例如存放

10個學生的名字,一般可以簡單定義這樣乙個二維陣列

char namearray[10][30]

。但是如果學生的個數不確定,再採用這種型別的宣告,宣告乙個固定大小的二維陣列,這種情況下需要定義乙個足夠大的二維陣列,來祈求使用者輸入千萬不能超過陣列大小,同時也浪費空間。如果採用動態分配,有使用者輸入陣列的大小,來動態分配二維陣列就不會存在這個問題。下面說一下兩種分配方式:

第一種:一次分配乙個10*30

的char空間

char (*namearray)[30]=(char (*)[30])malloc(10*sizeof(char [30]));

記憶體圖是這樣的:

也就是分配10

個記憶體為

30個字元大小的記憶體塊

第二種:先分配乙個陣列資料型別為指標的陣列,然後再分配10

個指向30

個字元記憶體塊,分別用指標陣列的元素指向它。**如下:

char **namearray=(char **)malloc(10 *sizeof(char *));

for(int i=0;i<10;i++)

namearray[i]=(char *)malloc(30*sizeof(char));

記憶體分配是這樣的。

兩種情況下,第一種適合於分配的二維陣列每行的元素個數是相同的,並且確定知道的每行元素的個數,第二行比著第一行比較自由,每一行元素的個數可以不同,但是資料訪問的速度比著第一行比較慢,資料量小的時候不明顯。從某種意義上來說,第一種更符合標準的語言中二維陣列的定義和分配方式,但是理解著可能有一定的難度,可以這樣理解,理解為是陣列元素是乙個儲存30

個char

大小的一維陣列的型別的一維陣列,這句話比較繞,具體說就是把乙個30個

char

大小的一維陣列定義為乙個資料型別,程式化來說可以這樣:

typedef struct  arrayitem arrayitem;

arrayitem namearray[10];

這樣也就比較容易理解了。第二種分配是分配一種鋸齒陣列,雖然某種意義上可能資料訪問速度稍微慢一些,但是空間相對來說比較節省一點,也可以說是犧牲時間節省空間。兩種分配方式下,都能通過

來取陣列元素的值,大家可以試一試,在

c語言中,不要過度區分*和

的區分方式,雖然有區別,但是在陣列方面,兩者的取值方式是近乎相同的。

動態分配二維陣列

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