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