哪个是分配内存的正确方法? 在这两种情况下会发生什么?
struct Node {
int data;
struct Node *next;
};
typedef struct Node *node;
int main() {
node head = (node)malloc(sizeof(node));//line 1
node head = (node)malloc(sizeof(struct Node));//line 2
}
答案 0 :(得分:4)
它是自引用的这一事实并不重要。第一次尝试的问题是您的typedef
隐藏了一个指针。因此,在您的代码中node
和struct Node
是两回事。第一个为struct Node
的指针分配空间,第二个为struct Node
的指针分配空间。
进行内存分配的首选方法是使用*
运算符隐式获取指向变量的类型,如下所示:
node head = malloc(sizeof *head);
sizeof
运算符很聪明,不会尝试“跟随”指针来查找*head
的大小。它只是检查其类型。
请注意,我也放弃了演员表。无需在C中强制转换malloc()
的结果。实际上,这样做是一个坏主意,因为如果您忘记#include
标头,它会隐藏一些问题。
此外,建议您不要隐藏带有typedef
的指针。它使代码的可读性降低,因为您将拥有看起来不像指针但必须像指针一样处理的东西(例外:如果您确实想要不透明的对象,有时还希望使用函数指针)。
所以这是我对您的完整建议:
struct node {
int data;
struct node *next;
};
typedef struct node Node;
int main() {
Node *head = malloc(sizeof *head);
}
答案 1 :(得分:-1)
在您的方案中,第二种方法是有效的。
在第一次尝试中,您为结构分配了一个指针的大小,但是您想要保留所有字节来保存整个结构而不是指向它的指针。
所以去
node head = (node)malloc(sizeof(struct Node));
你很好。