1. 程式人生 > >malloc申請二維陣列的四種方法

malloc申請二維陣列的四種方法

方法一: 二級指標

#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釋放哦

謝謝。