我想知道在这种情况下我是否必须分配两次内存。 例如: 认为我有结构:
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));
就足够了,是否存在任何一种情况都可以是真或假的情况?
答案 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字节指针和一个整数分配内存。节点结构不会自动分配。