簡體   English   中英

2D數組(指向指針的指針)

[英]2D array (pointer to pointer)

我想用隨機數填充2D數組,然后在main函數中調用它並進行打印。 但是我不能從main訪問函數FillMatrix

#define R 12 //row
#define S 10 //column

void FillMatrix(int m[][S], int row);
int main(int argc, char *argv[])
{
    int i, j;
    time_t t;

    // POINTER TO POINTER
    int **mat = (int **)malloc(R * sizeof(int *));
    if ((mat = (int**)malloc(R*sizeof(int))) == NULL)
    {
        printf("Error");
        return 0;
    }

    for (i = 0; i<R; i++)
        mat[i] = (int *)malloc(S * sizeof(int));

    FillMatrix(mat, R); //<- This line is the problem

    // RAND 0 - 1000
}

void FillMatrix(int m[][S], int row)
{
    int i, j;
    time_t t;
    srand((unsigned)time(&t));
    for (i = 0; i < row; i++)
        for (j = 0; j < S; j++)
            m[i][j] = rand() % 1000 + 0;
}

(mat = (int**)malloc(R*sizeof(int))分配了錯誤的空間;類型應為sizeof(int *)或等效的sizeof *mat 。此外,還會泄漏剛剛在前一個分配的內存線。

要解決此問題, if ((mat = (int**)malloc(R*sizeof(int))) == NULL)更改為if ( mat == NULL )


另外, int **int[][S]不兼容。 int **表示一個數組,其中每一行都是一個單獨的分配,但是int [][S]表示一個連續的內存塊。 您必須選擇要使用的兩種方法中的哪一種。

如果要使用單獨的行,則將函數更改為void FillMatrix(int **m, int row) (並且最好將列數作為參數,而不要使用全局S )。

或者,如果要使用連續內存塊,請將分配行更改為int (*mat)[S] = malloc(R * sizeof *mat);

好吧,您的代碼有點偏離。 我將假設您的主要功能在int i, j;之前開始int i, j; 並在調用FillMatrix(mat, R);

如果是這種情況,那么您需要在啟動主函數之前移動FillMatrix的函數定義,或者您需要在主函數之前預先聲明FillMatrix函數。

問題是您的主函數無法“看到”您的FillMatrix函數。 訂單非常重要。 如果尚未聲明,定義或以某種方式表明存在問題,那么就編譯器而言,該問題就不存在。 可以將其視為在函數中聲明變量之前嘗試訪問某些變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM