[英]Segmentation fault accessing struct member
我一直在學習 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: %s\n", n->name);
n = n->next;
}
}
int main()
{
printf("Start\n");
Thing t = make_thing();
add_node(&t, "one");
printf("First %s\n", t.node->name);
print_nodes(&t);
return 0;
}
您正在使用自動存儲超出其范圍的對象:
Node node = {
.name = name,
.next = t->node
};
t->node = &node;
return t;
在這里,您將返回后無效(超出范圍)的指針&node
泄漏給調用者並在此處使用它:
printf("First %s\n", t.node->name);
您必須使用malloc()
為您的Node
結構分配內存。
例子:
Node *node = malloc(sizeof *node);
node->name = name;
node->next = t->node;
t->node = node;
return t;
當不再使用內存時,您必須關心釋放內存以防止內存泄漏。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.