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

时间:2013-12-19 08:04:41

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:2)

尝试这样做。

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

答案 2 :(得分:0)

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

{ 
  printf("rows = ");
  scanf("%d", &rows);
  printf("columns = ");
  scanf("%d", &cols);

  int my_array[rows][cols];
}

将新数组归零:

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