[英]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
,可以为成员变量本身提供足够的内存,即,它为int
和struct node *
成员变量分配内存。 指针指向的内存地址不确定。 您需要分别为指针变量分配内存,以使其指向有意义的地方。
那就是
malloc()
是否成功。 free()
为你做的每一个分配。 这里有几件事。
您可能希望将指向ErrorCheck结构的指针保存在除本地变量之外的其他内容中,一旦buildList函数返回,该变量将消失。 您可以将其从函数返回给调用方,并将其存储在更持久的位置(“ main”中的全局变量或局部变量)。 您不需要立即分配列表变量,但是将其初始化为NULL是一个好主意。 然后使用另一个函数通过分配“下一个”指针并设置其内容(名称,等级和NULL)来添加节点。
稍后,您可以逐步浏览节点链以列出它们,或者在完成操作时一一释放它们。 对于新的C编码器,释放列表可能有些棘手。 但这是另一个问题。
您需要两个malloc。 malloc仅为结构的成员分配内存。 在您的示例中,第一个malloc为两个8字节指针和一个整数分配内存。 Node结构不会自动分配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.