[英]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.