如何为c中的自引用结构分配动态内存?
分配内存的正确方法是什么? 在这两种情况下会发生什么如何为c中的自引用结构分配动态内存?,c,data-structures,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 } 在您的场景中,第二种方法是
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
}
在您的场景中,第二种方法是有效的 在第一次尝试中,您将为结构分配指针的大小,但您希望保留保存整个结构所需的字节数,而不是指向它的指针 那就去吧
node head = (node)malloc(sizeof(struct Node));
你很好。它是自我参照的事实并不重要。第一次尝试的问题是
typedef
隐藏了指针。因此,在代码中,node
和struct node
是两个不同的东西。第一个为指向结构节点的指针分配空间,第二个为结构节点分配空间
执行内存分配的首选方法是使用*
运算符隐式获取指向变量的类型,如下所示:
node head = malloc(sizeof *head);
sizeof
操作符非常聪明,不会试图“跟随”指针来查找*头的大小。它只是检查它的类型
注意,我也抛弃了演员阵容。没有必要在C中强制转换malloc()
的结果。事实上,这样做是一个坏主意,因为如果忘记#包含头,它会隐藏一些问题
另外,我建议您不要用typedef
s隐藏指针。这会降低代码的可读性,因为有些东西看起来不像指针,但必须像指针一样处理(例外:如果确实需要不透明对象,有时需要函数指针)
下面是我给你的完整建议:
struct node {
int data;
struct node *next;
};
typedef struct node Node;
int main() {
Node *head = malloc(sizeof *head);
}
请不要键入定义指针。这就是让你困惑的地方。是的,你是对的,但是如果我们这样分配会发生什么呢?为什么不node head=malloc(sizeof(*node))代码>?@JL2210因为它不编译…,您的意思是节点头=malloc(sizeof(*head))代码>?关于“不要用typedef
s隐藏指针”的注意事项:对于函数指针,这肯定是可以的,甚至是为了可读性而推荐的。(我知道问题不在于此,但如果你把它作为一般规则来说…)请详细解释第1行和第2行之间的区别及其意义第一行类似于malloc(sizeof(struct Node*))
第二行类似于malloc(sizeof(struct Node))
是的,但在这两种情况下会发生什么,这是好的还是会有任何不想要的行为?第二个是正确的。第一个是错误的:head
指向的是错误大小的东西。如此未定义的行为。