【问题标题】:Errors when making a dynamic C array of structs制作动态 C 结构数组时出错
【发布时间】:2020-12-30 09:57:46
【问题描述】:

我有一个名为Collection的结构:

typedef struct collection {
   char *type;
   char *arg;
} *Collection;

我想要这个结构的动态数组(或者更确切地说,指向这个结构实例的指针)。这是我尝试过的:

Collection *rawCollections = malloc(0);
int colCounter = 0;
while (i < argc) {
    Collection col = malloc(sizeof(Collection));
    // code to fill in Collection
    rawCollections = realloc(rawCollections, sizeof(rawCollections) + sizeof(Collection));
    rawCollections[colCounter] = col;
    colCounter++;
}

我的理由是,每次我需要添加另一个时,我们都会将sizeof(Collection) 添加到数组中。我收到了这些错误,我不知道为什么:

realloc(): invalid next size
Aborted (core dumped)

【问题讨论】:

  • sizeof(rawCollections) does not change.
  • 您需要保留自己的计数器以重新分配大小(例如colCounter)。
  • 不要在 typedef 后面隐藏指针性质。它让每个人都感到困惑,包括你。
  • Collection col = malloc(sizeof(Collection)); 也是错误的。
  • Collectionstruct collection * 的类型定义。因此,您正在创建一个struct collection * 类型的变量并将其指向分配为struct collection * 大小的内存。也就是说,当您应该分配指向对象的大小时,您分配了指针的大小。您可以通过将 malloc 调用转换为 malloc(sizeof(*col)) 来解决此问题

标签: c pointers malloc dynamic-memory-allocation realloc


【解决方案1】:

您必须通过将数组元素的大小(指向 struct collection 的指针)乘以新的元素数 (colCounter + 1) 来计算数组的新大小。

还要注意在 typedef 后面隐藏指针是多么令人困惑:sizeof(Collection) 不是结构的大小。

这是修改后的版本:

struct collection **rawCollections = NULL;  // no need for `malloc(0)`
int colCounter = 0;
while (i < argc) {
    struct collection *col = malloc(sizeof(*col));
    // code to fill in Collection
    rawCollections = realloc(rawCollections, sizeof(*rawCollections) * (colCounter + 1));
    rawCollections[colCounter] = col;
    colCounter++;
}

【讨论】:

  • sizeof(Collection) 是指向结构的指针的大小,对吗?
  • @shurup: 是的,但是你写的Collection col = malloc(sizeof(Collection)); 是不正确的:你应该为结构分配空间,而不是为指针分配空间。
猜你喜欢
  • 2013-09-23
  • 2015-06-09
  • 1970-01-01
  • 2020-04-14
  • 2017-03-13
  • 1970-01-01
  • 2012-10-11
  • 2013-11-08
  • 1970-01-01
相关资源
最近更新 更多