calloc 导致错误访问

标签 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 数组中:

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);
}

该程序适用于输入的第一次迭代,但始终给出退出代码 11,并且调试器在分配时显示BAD_ACCESS

所以要么我错误地访问或分配了数组。

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

我认为我的分配没有任何问题。我哪里错了?

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

最佳答案

尽管您的代码似乎不完整并且我主要是猜测,但问题似乎出在您的 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])来实现。

由于tiles是一个struct,您也可以使用“箭头”作为第二种取消引用技术:(*tiles)->size

关于calloc 导致错误访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47331795/

相关文章:

c++ - 在 gdb 中使用 coredump 时,我如何确切知道哪个线程导致了 SIGSEGV?

c - 使用路由表查找目标地址的接口(interface)名称

c - C中malloc引起的内存泄漏

javascript - 我可以在 JavaScript 中同时获得对象和数组的好处吗?

c - 使用 calloc 手动输入 chars 导致崩溃

arrays - Linux需要多长时间清理堆内存

c - 我应该从哪里获得 STM32 微 Controller 的头文件?

如果 malloc 失败,C 释放二维数组

c - 如何为二维数组分配和释放堆内存?

c - 需要创建一个返回 int 的函数,该函数基于哪个 char 参数具有更多大写字母