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