在 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 编码器来说可能有点棘手;但那是另一个问题了。
我想知道在这种情况下是否必须分配两次内存。 例如: 认为我有结构:
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 编码器来说可能有点棘手;但那是另一个问题了。