我想用随机数填充2D数组,然后在main
函数中调用它并打印它。但我无法从FillMatrix
访问函数main
。
#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;
}
答案 0 :(得分:2)
<build>
<pluginManagement>
<plugins>
<plugin>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
</dependency>
</plugin>
</plugins>
</pluginManagement>
</build>
分配错误的空间;类型应为(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
答案 1 :(得分:1)
嗯,你的代码有点偏差。我将假设您的主要功能在int i, j;
之前开始,并在调用FillMatrix(mat, R);
之后结束。
如果是这种情况,则需要在启动main函数之前移动FillMatrix的函数定义,或者需要在main函数之前转发声明FillMatrix函数。
问题是您的主要功能无法“看到”您的FillMatrix功能。订单非常重要。如果某些内容尚未被声明,定义或以某种方式显示存在于问题中,那么就编译器而言它就不存在。可以把它想象成在函数中声明它之前尝试访问某个变量。