在C中重新分配双2D数组

时间:2013-11-30 10:17:51

标签: c malloc coordinates multidimensional-array realloc

我编写了一个函数,它应该为每个输入重新分配数组。我认为该功能运行良好,但是当我尝试使用数组时,我遇到了分段错误。

输入:

[1,2] [6,3] [2.5,3.5]

我必须检查用户是否以正确的格式'[' number ',' number ']'输入输入。我必须至少有2个条目。输入的结尾不是新行,而是EOF( CTRL + D CTRL + Z )。

我的代码:

double ** allocation (double ** field, int i)
{
   double x = 0, y = 0;
   char obr[1], cbr[1], col[1];

   while (scanf("%c%lf%c%lf%c", &obr, &x, &col, &y, &cbr) == 5)
   {
       if (col[0] != ',' || obr[0] != '[' || cbr[0] != ']')
           return 0;

       field = (double **) realloc(field, (i + 1) * sizeof(*field));
       if (field == NULL)
           return 0;

       field[i] = (double *)malloc(2 * sizeof(double));
       if (field[i] == 0)
           return 0;

       field[i][0] = x;
       field[i][1] = y;
       i++;
  }
  if (feof (stdin))
      return 0;

  return field;
}

当我想要使用它时:

double min = sqrtf(powf(field[0][0] - field[1][0], 2) + powf(field[0][1] - field[1][1], 2));

我会得到我的分段错误。

1 个答案:

答案 0 :(得分:0)

来自man realloc(强调我的):

  

realloc()函数尝试更改指向的分配大小   通过ptr来调整大小,然后返回ptr。如果没有足够的空间   扩大ptr指向的内存分配, realloc()创建一个新的   分配,复制尽可能多的ptr指向的旧数据   到新的分配,释放旧的分配,并返回一个指针   分配的内存。

当您使用realloc时,不能保证使用相同的内存,您需要将指针传回,以便将其移动到新位置。您可以通过检查它是否为NULL指针来检查是否成功。

tl; dr :您需要使用return field代替return 1return 0