【问题标题】:Mallocing a pointer to another struct in C将指向另一个结构的指针分配给 C
【发布时间】:2016-09-27 22:18:45
【问题描述】:

我想知道在这种情况下是否必须分配两次内存。 例如: 考虑到我有结构:

struct ErrorCheck {
    int returnValue;
    struct Nodes * list;
};

struct Nodes {
    char * name;
    int grade;
    struct Nodes * next;
};

还有一个分配它们的函数:

void buildList() {
    struct ErrorCheck * newStruct;
    newStruct = malloc(sizeof(struct ErrorCheck));
    newStruct->list = malloc(sizeof(struct Nodes));

}

如上所示,我必须两次 malloc 吗?或者如果我想同时使用这两个结构,第一个 malloc 就足够了。

如:newStruct = malloc(sizeof(struct ErrorCheck)); 本身就足够了,是否存在两种情况都可以为真或为假的情况?

【问题讨论】:

  • 让我们考虑一下:您想要访问 两个 对象。那么分配 one 对象就足够了吗?我不这么认为。
  • 技术上可以只使用一个malloc,但它很麻烦,不值得努力和复杂
  • 注意:在newStruct->list = malloc(sizeof(struct Nodes)); newStruct->list->next(和其他成员)之后仍然是单元化的。 `
  • 当然,但是那些在其他函数中被初始化:)

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


【解决方案1】:

这实际上取决于你想用 list 做什么。

  • 如果您希望 list 充当独立变量,并拥有自己的内存供您读取和写入,您将需要第二个 malloc()

  • 如果你想让list 像一个占位符,例如,分配一些其他已经分配的指针给它,然后使用它,在这种情况下,你不需要需要 ``malloc()。

malloc()-ing for sizeof(struct ErrorCheck) 并将指针存储到newStruct 为成员变量本身提供了足够的内存,即它为intstruct node * 成员变量分配内存。指针指向的内存地址是不确定的。您需要为指针变量单独分配内存,使其指向有意义的地方。

也就是说,

  • 在使用返回的指针之前,您应该始终检查malloc() 是否成功。
  • 您需要为每个分配调用free()

【讨论】:

  • "我是否必须像上面所示的那样进行两次 malloc?或者第一个 malloc 就足够了,如果我想同时使用这两个结构。" - 奥卡姆剃刀 ...
  • 我肯定要写到名单上,所以似乎是前者;
  • @Olaf use 不是一个非常明确的陈述,所以我尝试解释这两种情况,以避免任何可能的混淆。 :)
  • @Olaf:在第 6.7.6.3 节函数声明符(包括原型)中,它说:¶14 作为该函数定义的一部分的函数声明符中的空列表指定函数没有参数。不属于该函数定义的函数声明器中的空列表指定不提供有关参数数量或类型的信息。 对于函数定义,如问题中所述,省略 @987654332 @ 是允许且有效的,并定义该函数不带参数。我不会判断它是否构成它的原型。
  • 这并不是说我认为省略(void) 是一个好主意——我认为这不是一个好主意,我也不会在我自己的代码中省略它。但我建议谨慎对待它过于教条。请注意,与函数定义相反,函数声明中的空括号(圆括号)总是一个坏主意——要么指定(void) 以表示没有参数,要么正确指定实际的参数列表。在声明中,空括号是标准前 C 天的遗留物。
【解决方案2】:

这里有几件事。

您可能希望将指向 ErrorCheck 结构的指针保存在局部变量之外,一旦 buildList 函数返回,该局部变量就会消失。您可以将它从函数返回给调用者并将其存储在更持久的位置(全局变量或“main”中的局部变量)。您不需要立即分配列表变量,但最好将其初始化为 NULL。然后使用另一个函数通过分配“下一个”指针并设置其内容(名称、等级和 NULL)来添加节点。

您可以稍后逐步遍历节点链以列出它们或在完成后将它们一一释放。对于新的 c 编码器来说,释放列表可能有点棘手;但这是另一个问题。

【讨论】:

    【解决方案3】:

    你需要两个 malloc。 malloc 只为结构的成员分配内存。在您的示例中,第一个 malloc 为两个 8 字节指针和一个整数分配内存。节点结构不会自动分配。

    【讨论】:

    • "malloc 只为结构的成员分配内存。" - 不。它为struct 类型的对象分配一块内存,而不仅仅是成员(这将如何工作?)。并且没有指示指针有 8 个字节。这在那个层面上是无关紧要的。不要不必要地混合实现细节。
    猜你喜欢
    • 2018-05-16
    • 2019-03-18
    • 2018-04-25
    • 2017-07-13
    • 2013-01-21
    • 1970-01-01
    • 2013-03-04
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多