【问题标题】:Passing 2-d array to a function in C将二维数组传递给 C 中的函数
【发布时间】:2021-01-11 23:04:36
【问题描述】:

我正在尝试创建一个函数,该函数在给定变量名称和行数和列数(在本例中为 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 *)); 通知指向int 的指针的大小,并且没有强制转换。
  • 见上面的评论。如果指针大于系统上的整数(这很可能),那么您没有为指针数组分配足够的空间,因为您在需要 sizeof(int *) 的地方使用 sizeof(int)
  • 亲爱的 Op,欢迎来到 S.O.考虑使用 `` 而不是 "" 来显示代码 AND 错误消息 ...

标签: arrays c function multidimensional-array


【解决方案1】:
int **matrix = (int **)malloc(n*sizeof(int));

应该是

int **matrix = malloc(n*sizeof(int*));

在您的架构中,sizeof(int)sizeof(void*) 碰巧没有相同的值。

不需要强制转换 malloc 的输出,因为 void* 可以正确地表现为任何其他指向对象的指针。

【讨论】:

  • 一个简单、优雅的解决方案:)
  • @APJo 其实现在我看到有人已经评论了。
  • 答案比 cmets 好。
  • @alinsoar 为什么void * 可以隐式转换为int ** 但我的char ** 不能隐式转换为void ** - 这背后有什么真正的逻辑还是...?跨度>
【解决方案2】:
int **matrix = (int **)malloc(n*sizeof(int));

主要问题是sizeof (int) 与您系统上的sizeof (int *) 不同,因此您没有分配足够的空间。上面的调用可以改写为

int **matrix = malloc( n * sizeof *matrix );

演员表是不必要的1sizeof *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
  }
}

最终结果 - main 返回 int,而不是 void。除非您的编译器专门void main( int, char ** ) 记录为有效签名,否则使用它会调用未定义的行为。您的代码可能运行得很好,但是在某些平台(诚然是旧的或古怪的)将main 输入为void 会导致问题。


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

【讨论】:

    猜你喜欢
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多