繁体   English   中英

将二维数组传递给 C 中的函数

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

您应该始终检查malloccallocrealloc调用的结果。 虽然失败很少见,但它们可能会发生:

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会导致问题。


  1. 除非您将此代码编译为 C++ 或使用古老的 C89 之前的编译器。
  2. sizeof是一个operator ,而不是一个函数 - 只有在操作数是类型名称时才需要括号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM