malloc申請二維陣列的四種方法
阿新 • • 發佈:2019-02-02
方法一: 二級指標
#include<stdio.h> #include<stdlib.h> int main() { int i,j; int row = 4,col = 5; //申請一個 4行 5列的二維陣列 int **ar = (int**)malloc(sizeof(int*) * row); //sizeof(int*),不能少*,一個指標的記憶體大小,每個元素是一個指標。 for (i = 0;i < row;i++) { ar[i] = (int*)malloc(sizeof(int) * col); } for (i = 0;i < row;i++) { for (j = 0;j < col;j++) { printf("%p ",&ar[i][j]); } printf("\n"); } for (i = 0;i < row;i++) free(ar[i]); free(ar); return 0; }
執行結果 可見地址是連續的,且int大小為4個位元組
方法二: 陣列指標
#include<stdio.h> #include<stdlib.h> int main() { int i,j; int row = 4,col = 5; //申請一個 4行 5列的二維陣列 int (*ar)[col] = (int(*)[col])malloc(sizeof(int) * row * col); //(*ar) 括號不能少,[]優先順序高,少了就是指標陣列了 for (i = 0;i < row;i++) { for (j = 0;j < col;j++) { printf("%p ",&ar[i][j]); } printf("\n"); } free(ar); return 0; }
執行結果
方法三: 一維陣列模擬二維陣列
#include<stdio.h> #include<stdlib.h> int main() { int i,j; int row = 4,col = 5; //申請一個 4行 5列的二維陣列 int *ar =(int*)malloc(sizeof(int) * row * col); for (i = 0;i < row;i++) { for (j = 0;j < col;j++) { printf("%p ",&ar[i * col + j]); } printf("\n"); } free(ar); return 0; }
執行結果
方法四: 用結構體,每個結構體定義 col個元素的一維陣列,不過這樣用不方便且繁瑣。
typedef struct {
int a[5];
}item;
item *ar = (item*)malloc(sizeof(item) * 4);
總結:幾種方法都可以動態的申請二維陣列,但就我做題來看,幾乎用的全是第一種和第二種方法。如果以指標為引數傳遞給一個函式一個二維陣列要用方法一,方法二會報錯。不過方法二簡潔,只需要一行程式碼。malloc記憶體用完後記得要free釋放哦
謝謝。