如何在c中为自引用结构分配动态内存?

时间:2019-09-13 14:48:39

标签: c data-structures

哪个是分配内存的正确方法? 在这两种情况下会发生什么?

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
}

2 个答案:

答案 0 :(得分:4)

它是自引用的这一事实并不重要。第一次尝试的问题是您的typedef隐藏了一个指针。因此,在您的代码中nodestruct 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));

你很好。