【问题标题】:Realloc double 2D array in CC中的Realloc双二维数组
【发布时间】:2013-12-16 10:24:41
【问题描述】:

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

输入:

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

我必须检查用户输入的输入格式是否正确'[' number ',' number ']'。我必须至少有 2 个条目。输入的结尾不是新行,而是 EOF(CTRL+DCTRL+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));

我会遇到分段错误。

【问题讨论】:

  • 问题是你的allocation 函数返回值1 而它应该返回一个指向double 数组的指针吗?
  • (另外)我猜问题是你修改了field 本地(通过使用realloc),当你离开函数时它的新值被丢弃.
  • 可能是return 1; -> return field;
  • 你们都说得对,但是我尝试在函数中做数学函数,同样的效果(分段错误),无论如何我会尝试修改它。
  • 我之前添加了field = (double **) malloc((i + 1) * sizeof(*field));,但还是不行,有人可以帮帮我吗?

标签: c malloc coordinates multidimensional-array realloc


【解决方案1】:

来自man realloc(强调我的):

realloc() 函数试图改变分配的大小 to by ptr 到大小,并返回 ptr。如果没有足够的空间 扩大ptr指向的内存分配,realloc()创建一个新的 分配,尽可能多地复制ptr指向的旧数据 到新的分配,释放旧的分配,并返回一个指针 分配的内存。

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

tl;dr:您需要使用return field 而不是return 1return 0

【讨论】:

  • 对不起,我是初学者,没有得到你的提示。
  • 不,我的错。您需要使用return 将其传回,因为一旦您使用realloc,您返回的field 的副本在您使用return 并离开该功能后就会“丢失”。
  • 它仍然没有解决我的问题。而且我不知道为什么会以点击Enter结束。
猜你喜欢
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
相关资源
最近更新 更多