我想用随机数填充二维数组,然后在 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);
关于c - 二维数组(指针到指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34142676/