[英]Passing 2-d array to a function in C
我正在尝试创建一个函数,该函数根据变量名称以及行数和列数(在本例中为 n)来初始化随机二维方阵。 此代码返回“分段错误”错误,我不知道为什么。 我试过在函数 initM 中的 if-else 中使用 &,但随后返回“错误:左值需要作为赋值的左操作数”有谁知道如何使它工作?
void initM (int n, int **matrix){
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (i == j) matrix[i][j] = 101;
else matrix[i][j] = (rand() % 101);
}
}
}
void main (int argc, char *argv[]){
int n = atoi(argv[1]);
int **matrix = (int **)malloc(n*sizeof(int));
for(int i = 0; i < n; i++) matrix[i] = (int *)malloc(n*sizeof(int));
initM(n, matrix);
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
printf("%d ", matrix[i][j]);
}
printf("\n");
}
for (int i = 0; i < n; i++) free(matrix[i]);
free(matrix);
}
int **matrix = (int **)malloc(n*sizeof(int));
它应该是
int **matrix = malloc(n*sizeof(int*));
在您的架构中, sizeof(int)
和sizeof(void*)
的值不同。
不需要转换 malloc 的输出,因为 void* 可以像任何其他指向对象的指针一样正确地表现。
int **matrix = (int **)malloc(n*sizeof(int));
主要问题是sizeof (int)
与系统上的sizeof (int *)
,因此您没有分配足够的空间。 上面的调用可以改写为
int **matrix = malloc( n * sizeof *matrix );
强制转换是不必要的1 ,而sizeof *matrix == sizeof (int *)
2 。
同样,您可以将每个matrix[i]
分配为
matrix[i] = malloc( n * sizeof *matrix[i] ); // sizeof *matrix[i] == sizeof (int)
您应该始终检查malloc
、 calloc
或realloc
调用的结果。 虽然失败很少见,但它们可能会发生:
int **matrix = malloc( n * sizeof *matrix );
if ( matrix )
{
for ( i = 0; i < n; i++ )
{
matrix[i] = malloc( n * sizeof *matrix[i] );
if ( matrix[i] )
// do stuff
}
}
最终 nit- main
返回int
,而不是void
。 除非您的编译器专门将void main( int, char ** )
为有效签名,否则使用它会调用未定义的行为。 您的代码可能运行得很好,但在某些(公认的旧的或古怪的)平台上,将main
键入为void
会导致问题。
sizeof
是一个operator ,而不是一个函数 - 只有在操作数是类型名称时才需要括号。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.