Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为c中的自引用结构分配动态内存?_C_Data Structures - Fatal编程技术网

如何为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
指向的是错误大小的东西。如此未定义的行为。