動態分配二維陣列

2021-05-18 08:07:30 字數 3766 閱讀 7580

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-2

char* a[m];

//指標的陣列

int i;

for(i=0; ia[i] = (char *)malloc(sizeof(char) * n);

printf("%d/n", sizeof(a));

//4*m,指標陣列

printf("%d/n", sizeof(a[0]));

//4,指標

for(i=0; ifree(a[i]);

(3)已知第一維,一次分配記憶體(保證記憶體的連續性)

code-3

char* a[m];

//指標的陣列

int i;

a[0] = (char *)malloc(sizeof(char) * m * n);

for(i=1; ia[i] = a[i-1] + n;

printf("%d/n", sizeof(a));

//4*m,指標陣列

printf("%d/n", sizeof(a[0]));

//4,指標

free(a[0]);

(4)兩維都未知

code-4

char **a;

int i;

a = (char **)malloc(sizeof(char *) * m);

//分配指標陣列

for(i=0; i

printf("%d/n", sizeof(a));

//4,指標

printf("%d/n", sizeof(a[0]));

//4,指標

for(i=0; i

free(a);

(5)兩維都未知,一次分配記憶體(保證記憶體的連續性)

code-5

char **a;

int i;

a = (char **)malloc(sizeof(char *) * m);

//分配指標陣列

a[0] = (char *)malloc(sizeof(char) * m * n);

//一次性分配所有空間

for(i=1; i

printf("%d/n", sizeof(a));

//4,指標

printf("%d/n", sizeof(a[0]));

//4,指標

free(a[0]);

free(a);

2.c++動態分配二維陣列

(1)已知第二維

code-6

char (*a)[n];

//指向陣列的指標

a = new char[m][n];

printf("%d/n", sizeof(a));

//4,指標

printf("%d/n", sizeof(a[0]));

//n,一維陣列

delete a;

(2)已知第一維

code-7

char* a[m];

//指標的陣列

for(int i=0; ia[i] = new char[n];

printf("%d/n", sizeof(a));

//4*m,指標陣列

printf("%d/n", sizeof(a[0]));

//4,指標

for(i=0; idelete a[i];

(3)已知第一維,一次分配記憶體(保證記憶體的連續性)

code-8

char* a[m];

//指標的陣列

a[0] = new char[m*n];

for(int i=1; ia[i] = a[i-1] + n;

printf("%d/n", sizeof(a));

//4*m,指標陣列

printf("%d/n", sizeof(a[0]));

//4,指標

delete a[0];

(4)兩維都未知

code-9

char **a;

a = new char* [m];

//分配指標陣列

for(int i=0; i

printf("%d/n", sizeof(a));

//4,指標

printf("%d/n", sizeof(a[0]));

//4,指標

for(i=0; idelete a[i];

delete a;

(5)兩維都未知,一次分配記憶體(保證記憶體的連續性)

code-10

char **a;

a = new char* [m];

a[0] = new char[m * n];

//一次性分配所有空間

for(int i=1; i

printf("%d/n", sizeof(a));

//4,指標

printf("%d/n", sizeof(a[0]));

//4,指標

delete a[0];

delete a;

多說一句:new和delete要注意配對使用,即有多少個new就有多少個delete,這樣才可以避免記憶體洩漏!

3.靜態二維陣列作為函式引數傳遞

如果採用上述幾種方法動態分配二維陣列,那麼將對應的資料型別作為函式引數就可以了。這裡討論靜態二維陣列作為函式引數傳遞,即按照以下的呼叫方式:

int a[2][3];

func(a);

c語言中將靜態二維陣列作為引數傳遞比較麻煩,一般需要指明第二維的長度,如果不給定第二維長度,則只能先將其作為一維指標傳遞,然後利用二維陣列的線性儲存特性,在函式體內轉化為對指定元素的訪問。

首先寫好測試**,以驗證引數傳遞的正確性:

(1)給定第二維長度

code-11

void func(int a[n])

(2)不給定第二維長度

code-12

void func(int* a)

注意:使用該函式時需要將二維陣列首位址強制轉換為一維指標,即func((int*)a);

總結:(一)二維都不知——c語言

int**

p;   

inti;      

//申請空間   p =

(int

**)malloc(

sizeof

(int*)

*m);  

for(i=0

; i<

m; i

++)  

p[i] =(

int*

)malloc(

sizeof

(int)*

n);  

//釋放空間  

for(i=0

; i<

m; i

++)  

free(p[i]);  

free(p);  

動態分配二維陣列

原文摘自 假設我需要乙個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但這個方法每次分配指...

動態分配二維陣列

最近做的乙個東西需要動態分配大空間的二維陣列,然後進行整塊記憶體 緩衝區 buffer 的操作,出現了二維陣列空間不連續的問題。動態分配二維陣列的一般方法是這樣 假設陣列存的資料型別是int int p null p new int nwidth if p for int j 0 j這段 淺顯易懂,...