在C中使用指向另一个结构的指针

时间:2016-09-27 22:18:45

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

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

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));就足够了,是否存在任何一种情况都可以是真或假的情况?

3 个答案:

答案 0 :(得分:4)

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

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

  • 例如,如果您希望list充当占位符,请为其分配一些其他已分配的指针,然后使用它,在这种情况下,您不要不需要``malloc()。

malloc() - 为sizeof(struct ErrorCheck)并将指针存入newStruct,为成员变量本身提供足够的内存,即为int分配内存和struct node *成员变量。指针所指向的内存地址是不确定的。你需要将内存分别分配给指针变量,使其指向有意义的地方。

那就是说,

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

答案 1 :(得分:1)

这里有几件事。

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

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

答案 2 :(得分:0)

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