如何在C中为链表的头分配空间?

如何在C中为链表的头分配空间?,c,linked-list,valgrind,C,Linked List,Valgrind,虽然这段代码可以在没有任何警告或错误的情况下运行,但Valgrind会给出一些消息,说明条件跳转或移动取决于未初始化的值,未初始化的值是由堆分配创建的 我不知道出了什么问题。我们在main函数之外定义了一个节点结构。因此,我认为我们可以使用sizeof(struct node),不是吗?您需要初始化数据和下一个带有head的指针。我是说 struct node { int data; struct node *next; }; int m

虽然这段代码可以在没有任何警告或错误的情况下运行,但Valgrind会给出一些消息,说明
条件跳转或移动取决于未初始化的值
未初始化的值是由堆分配创建的


我不知道出了什么问题。我们在
main
函数之外定义了一个
节点
结构。因此,我认为我们可以使用sizeof(struct node)
,不是吗?

您需要初始化数据和下一个带有head的指针。我是说

    struct node {
        int data;
        struct node *next;
    };

    int main() {

        struct node *head = malloc(sizeof(struct node));
        struct node *current = head;
        ...
    };

它将通过Valgrind检查

您需要初始化数据和下一个指针。我是说

    struct node {
        int data;
        struct node *next;
    };

    int main() {

        struct node *head = malloc(sizeof(struct node));
        struct node *current = head;
        ...
    };

它将通过Valgrind检查

通常链表的头只是一个指针,而不是一个结构,因此它不需要任何内存分配。它的值将是
NULL
(空列表)或指向第一个节点的有效指针。@WeatherVane关于列表标题的注释是正确的,但使用上述方法为列表分配的每个节点都将从Valgrind生成相同的投诉,所以这里有一个好问题。@WeatherVane我将其修改为
struct node*head
;然后
struct node*current=malloc(sizeof(struct node))然后它会出现
分段falut(内核转储)
.1)malloc返回
void*
,您需要将其强制转换到
(节点*)
2)malloc不会初始化内存,所以您需要这样做
memset(head,0,sizeof(struct node);
@Hedgehog在C中你不需要强制转换它。请注意,通常链表的头只是一个指针,而不是一个
struct
,因此它不需要任何内存分配。它的值将是
NULL
(空列表)或者是指向第一个节点的有效指针。@WeatherVane关于列表标题的注释是正确的,但是使用上述方法为列表分配的每个节点都会从Valgrind生成相同的投诉,因此这里有一个好问题。@WeatherVane我将其修改为
struct node*head
;然后
struct node*current=malloc(sizeof(struct node));
然后它会出现
分段falut(内核转储)
.1)malloc返回
void*
,您需要将其强制转换为
(node*)
2)malloc不会初始化内存,所以您需要这样做
memset(head,0,sizeof(struct node);
@Hedgehog在C中你不需要使用它。请查看或使用
calloc
。或使用
calloc