我正试图将节点附加到列表的末尾,因此我编写了一个简单的append_node
函数。此函数正常工作,但当我使用for
循环时,带有undefined value
的额外节点会存储到头节点中。
这是代码:
int main() {
linked_list *list;
append_node(&list, 4);
append_node(&list, 20);
append_node(&list, 200);
print_linked_list(list); // 4 20 200
//prints just fine
}
上面的代码运行良好,但当我在下面这样做时:
int main() {
linked_list *list;
for (int i = 0; i < 5; i++)
append_node(&list, i);
print_linked_list(list); // 11342689 0 1 2 3 4
// prints a extra undefined node here at the head
}
预期结果:0 1 2 3 4
实际结果:11342689 0 1 2 3 4
这是append_node
函数:
void append_node(linked_list **head_ref, int value) {
linked_list *current = *head_ref;
linked_list *new_node = (linked_list *)malloc(sizeof(linked_list));
new_node->node_value = value;
new_node->next_node = NULL;
if (*head_ref == NULL) {
*head_ref = new_node;
return;
}
while (current->next_node)
current = current->next_node;
current->next_node = new_node;
return;
}
每当我使用loop
时,列表就会得到一个带有未定义值的新头。列表的其余部分似乎是正确的。我不知道为什么会发生这种事。有人能告诉我吗?提前感谢:(
您应该将linked_list *list
初始化为NULL
,它应该可以正常工作。
具有自动存储持续时间的变量不会隐式初始化。Si在此声明中
linked_list *list ;
则声明具有不确定值的指针CCD_ 10。
因此,程序具有未定义的行为。
你必须像一样明确地初始化指针
linked_list *list = NULL;
除此之外,考虑到指针list
是通过引用函数传递的,函数append_node
可以被定义得更简单、更安全。
给你。
int append_node( linked_list **head_ref, int value )
{
linked_list *new_node = malloc( sizeof( linked_list ) );
int success = new_node != NULL;
if ( success )
{
new_node->node_value = value;
new_node->next_node = NULL;
while ( *head_ref != NULL )
{
head_ref = &( *head_ref )->next_node;
}
*head_ref = new_node;
}
return success;
}
main
中的list
变量未初始化。在这两种情况下,代码都有未定义的行为。未定义的行为有时会产生预期的行为,有时不会。为两个函数生成的代码不同,因此在第一种情况下,存储list
的位置可能恰好是空指针,而不是第二种情况。
恐怕即使在编译启用了额外警告(gcc -Wall -Wextra -Werror
(的程序时也不会发现此错误。
这是一个修改版本:
#include <stdio.h>
#include <stdlib.h>
typedef struct linked_list {
struct linked_list *next_node;
int node_value;
} linked_list;
void print_linked_list(const linked_list *list) {
while (list) {
printf("%d ", list->node_value);
}
printf("n");
}
linked_list *append_node(linked_list **head_ref, int value) {
linked_list *current = *head_ref;
linked_list *new_node = malloc(sizeof(linked_list));
if (new_node) {
new_node->node_value = value;
new_node->next_node = NULL;
if (current == NULL) {
*head_ref = new_node;
} else {
while (current->next_node)
current = current->next_node;
current->next_node = new_node;
}
}
return new_node; // if memory allocation failed, the function will return NULL
}
int main() {
linked_list *list = NULL;
for (int i = 0; i < 5; i++)
append_node(&list, i);
print_linked_list(list);
return 0;
}