calloc导致访问不良

时间:2017-11-16 14:08:42

标签: c arrays calloc

我的main功能有:

 int main() {
  //
  double minW, minL, width, length;
  unsigned tileCap = 10;
  auto *tiles = (Tile*)calloc(tileCap, sizeof(Tile) );
  GetInput(&minW, &minL, &tiles, &tileCap);
 }

我的GetInput()会读取并保存到Tile s:

的数组中
void GetInput(double *w, double *l, Tile **tiles, unsigned *tileCap) {
  //
  printf("Tile:\n");
  double tileSize, tileJoint;
  int argc;
  unsigned tileCount = 0;

  do {
    argc = scanf("%lf %lf", &tileSize, &tileJoint);
    if (tileSize == 0 || !CorrectSize(tileSize) || !CorrectSize(tileJoint) || argc != 2)
      BadInput();

    bool needTransform = HasFloatingPoint(tileSize);
    if(needTransform) {
      tileSize = MultiplyByTen(tileSize);
      tileJoint = MultiplyByTen(tileJoint);
    }

    tiles[tileCount]->size = (long long)tileSize;
    printf("%lld\n", tiles[tileCount]->size);
    tiles[tileCount]->joint = (long long)tileJoint;

    if(++tileCount == *tileCap) {
      DoubleArray(tiles, tileCap); //f() with realloc
    }
  } while(argc != EOF);
}

此程序适用于输入的第一次迭代,但始终提供exit code 11,调试器在分配时显示BAD_ACCESS

所以我正在访问或分配错误的数组。

我给我的函数一个双指针。因此,为了访问Tile成员,我需要将其解除引用两次。一个解除引用是[],另一个是->。分配后打印Tile确认。

我认为我的分配没有错。我哪里错了?

编辑:tiles[index]->size意味着*(tiles[index]).size,而我需要(*tiles)[index].size。取消引用顺序和范围很重要。

1 个答案:

答案 0 :(得分:1)

即使你的代码看起来不完整而且我大多猜测,问题似乎在main函数的以下行中:

 GetInput(&minW, &minL, &tiles, &tileCap);

您应该考虑tiles已经是指针。当你使用&tiles时,你实际上是在指针指向而不是指针本身。

GetInput函数中,您使用tiles[tileCount]表示您想要传递指针。如果您的GetInput应该获得双指针,那么您将使用(*tiles)[tileCount]

您可以通过聆听来解决其中的许多问题

我认为你可能想做的是:

 GetInput(&minW, &minL, tiles, &tileCap);

函数定义应该如下所示:

 void GetInput(double *w, double *l, Tile *tiles, unsigned *tileCap

编辑:(使用双指针)

因为您需要使用双指针,所以在您查看数据时应该记住取消引用双指针。即:

*(tiles)[tileCount]->size = (long long)tileSize;
printf("%lld\n", *(tiles)[tileCount]->size);
*(tiles)[tileCount]->joint = (long long)tileJoint;

说明:

双指针需要双重引用。第一个解除引用收集有关嵌套指针(*tiles)的信息,第二个解除引用收集数据(**tiles)。

使用方括号((*tiles)[i]tiles[0][i])也可以实现双重解除引用。

由于tilesstruct,您可以使用“箭头”作为第二种解除引用技术:(*tiles)->size