【问题标题】:Dynamic allocate 2d array and init it (segmentation fault)动态分配二维数组并初始化它(分段错误)
【发布时间】:2014-01-07 16:55:57
【问题描述】:

我正在学习 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 语句,它可以正常工作..

【问题讨论】:

  • 在你真正开始分配二维数组的业务后,给scanf(" %d", &amp;myArray[i][j]);添加空间

标签: c multidimensional-array dynamic-memory-allocation


【解决方案1】:

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

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

  • 使其“锯齿状”,其中每一行都有自己指向该行元素的指针。这就是@bgamlath 在his answer 中的建议。
  • 自行建立索引,将myArray[i][i] 替换为myArray[i * cols + j]

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

【讨论】:

    【解决方案2】:

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

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

    将新数组归零:

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

    【讨论】:

    • 仅从 C99 开始,只要输入不是太大而导致堆栈溢出
    • 当然。任何不使用 C99 或更高版本的人都需要坚持使用 mallocfree。由于@Nat95 告诉我们他是初学者,我引导他使用 VLA 有两个原因:1) 符号方便,尤其是他正在寻找的多维数组,2) 免于围绕 malloc 和 @987654327 的无尽 C 初学者错误@.
    【解决方案3】:

    试试这样。

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-28
    • 2013-10-04
    • 2013-09-04
    • 1970-01-01
    • 2012-01-27
    • 2016-04-23
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多