繁体   English   中英

在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;
};

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

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()设置sizeof(struct ErrorCheck) newStruct sizeof(struct ErrorCheck)并将指针存储到newStruct ,可以为成员变量本身提供足够的内存,即,它为intstruct node *成员变量分配内存。 指针指向的内存地址不确定。 您需要分别为指针变量分配内存,以使其指向有意义的地方。

那就是

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

这里有几件事。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM