我一直在学习C语言,但在使用链表时遇到问题。当循环指向链表的指针时,我遇到了分段错误,我不知道为什么。
看看类似的问题,建议分配内存,但我发现这个答案令人困惑。您是否必须对链表使用堆内存,如果是,为什么?
这是我的代码:
#include <stdio.h>
typedef struct Node {
char *name;
struct Node *next;
} Node;
typedef struct Thing {
Node *node;
} Thing;
Thing make_thing()
{
Thing t = {
.node = NULL
};
return t;
}
Thing * add_node(Thing *t, char *name)
{
Node node = {
.name = name,
.next = t->node
};
t->node = &node;
return t;
}
void print_nodes(Thing *t)
{
Node *n = t->node;
while(n != NULL) {
printf("Node: %sn", n->name);
n = n->next;
}
}
int main()
{
printf("Startn");
Thing t = make_thing();
add_node(&t, "one");
printf("First %sn", t.node->name);
print_nodes(&t);
return 0;
}
您正在使用自动存储超出其范围的对象:
Node node = {
.name = name,
.next = t->node
};
t->node = &node;
return t;
在这里,您将指针&node
泄漏给调用方,该指针在返回后无效(超出范围(,并在此处使用它:
printf("First %sn", t.node->name);
您必须通过对Node
结构使用malloc()
来分配内存。
例:
Node *node = malloc(sizeof *node);
node->name = name;
node->next = t->node;
t->node = node;
return t;
当不再使用内存以防止内存泄漏时,您必须关心释放内存。