在 C 中分配指向另一个结构的指针

Mallocing a pointer to another struct in C

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

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

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

还有一个 mallocs 它们的函数:

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

}

我是否必须像上面那样 malloc 两次?或者如果我想同时使用这两个结构,第一个 malloc 是否足够。

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

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

  • 如果您希望 list 作为一个独立的变量使用它自己的内存,您可以在其中读取和写入,您将需要第二个 malloc()

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

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

也就是说,

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

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

这里有几件事。

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

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