私は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;
メモリリークを防ぐために使用されなくなったメモリを解放することに注意する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加