首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >calloc导致不良访问

calloc导致不良访问
EN

Stack Overflow用户
提问于 2017-11-16 14:08:42
回答 1查看 106关注 0票数 0

我的main函数如下:

代码语言:javascript
复制
 int main() {
  //
  double minW, minL, width, length;
  unsigned tileCap = 10;
  auto *tiles = (Tile*)calloc(tileCap, sizeof(Tile) );
  GetInput(&minW, &minL, &tiles, &tileCap);
 }

我的GetInput()将读取并保存到Tile的数组中:

代码语言:javascript
复制
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。销毁顺序和范围非常重要。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-16 14:15:29

尽管您的代码看起来不完整,我主要是猜测,但问题似乎出现在您的main函数的下面一行:

代码语言:javascript
复制
 GetInput(&minW, &minL, &tiles, &tileCap);

您应该考虑tiles已经是一个指针。使用&tiles时,实际上是将指针传递给指针,而不是指针本身。

在您的GetInput函数中,您使用的是tiles[tileCount],它指示您要传递一个指针。如果您的GetInput应该得到一个双指针,则应该使用(*tiles)[tileCount]

你可以通过倾听来解决其中的许多问题。

我想你可能想做的是:

代码语言:javascript
复制
 GetInput(&minW, &minL, tiles, &tileCap);

函数定义应该如下所示:

代码语言:javascript
复制
 void GetInput(double *w, double *l, Tile *tiles, unsigned *tileCap

编辑:(使用双指针)

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

代码语言:javascript
复制
*(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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47331795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档