C语言 动态分配 2d 数组并初始化它(分段错误)



我正在学习 C,我试图为 2D 数组分配内存(我从用户那里获得的数组尺寸),但在我尝试初始化它后我遇到了分割错误。我的代码是这样的:

#include <stdio.h>
#include <stdlib.h>
int main()
{
   printf("give the dimensions!n");
   int row,col,i,j; 
   int **myArray;
   printf("nrows = ");
   scanf("%d", &row);
   printf("columns = ");
   scanf("%d", &col);
   myArray = malloc(row*sizeof(*myArray) + col*sizeof(**myArray));
   printf("Init the array: n");
   for (i = 0; i < row; i++)
   {
       for (j = 0; j <col ; j++)
       {
           scanf("%d", &myArray[i][j]);
       }
   }
   return 0;
}

如果我将数组更改为myArray[2][2]并省略 malloc 语句,它可以正常工作。.

C 无法知道您的索引应该如何工作:没有信息将列数 ( col ) 与 myArray 相关联。当你myArray[i][j] myArray声明为 int * * 时,C 将首先评估myArray[i],即读取 myArray 的第 i:th 值,就好像它是一个整数指针一样,但事实并非如此。然后,它将从该无效值索引j,可能会生成分段错误(至少导致未定义的行为)。

像这样手动执行此操作时,您有两种选择:

  • 使其"锯齿状",其中每一行都有自己的指向该行元素的指针。这就是@bgamlath在他的回答中建议的。
  • 自己做索引,用myArray[i * cols + j]替换myArray[i][i]

后者使用更少的内存和(方式)更少的内存分配,这很好。当然,索引可能有点尴尬。

尝试这样做。

  table = malloc(row*sizeof(int *));
  for(i = 0; i<row; i++)
    table[i] = malloc(col * sizeof(int));

您可以像这样分配动态数组。无需malloc

{ 
  printf("rows = ");
  scanf("%d", &rows);
  printf("columns = ");
  scanf("%d", &cols);
  int my_array[rows][cols];
}

要将新阵列归零:

  memset(my_array, 0, rows*cols*sizeof(int));

最新更新