私は、単純なリンクリストポインタ - メモリロケーションへの一貫性のないアクセス
#include <stdio.h>
struct node{
int value;
struct node* next;
};
typedef struct {
struct node* root;
} ll;
void add_to_ll(int value, ll* linked_list) {
struct node new_node = {value, linked_list->root};
linked_list->root = &new_node;
}
void print_ll(ll* ll2) {
printf("%p", ll2);
struct node* temp = ll2->root;
while (temp->next != NULL) {
printf("%d ", temp->value);
temp = temp->next;
}
}
int main()
{
printf("Creating a linked list...\n");
struct node root_node = {1, NULL};
ll my_linked_list = { &root_node };
for (int i = 0; i < 10000; i++) {
add_to_ll(i, &my_linked_list);
}
printf("my_linked_list root value %d\n", my_linked_list.root->value);
printf("my_linked_list root value %d\n", my_linked_list.root->value);
printf("my_linked_list root value %d\n", my_linked_list.root->value);
return 0;
}
を定義しようとしています、私は取得しています出力は次のようになります。
Creating a linked list...
my_linked_list root value 9999
my_linked_list root value 429391991
my_linked_list root value 429391991
私はroot
のvalue
を取得することができていますノードを正しく最初に起動します。しかし、それを2度目(それ以後)に読もうとすると値が変化します。私は何が欠けていますか?
'add_to_ll'はメモリを割り当てません。あなたのリストにぶら下がっているポインタを追加しています(終了するまで、一時的にそれを割り当てています)。そしてあなたは*未定義の動作*の素敵なイラストを見ています。 –
'new_node'に割り当てられたメモリは' add_to_ll'が返るまでしか使えないので、そのメモリへのポインタを返すことは未定義の動作です。 'malloc'を使用して新しいノードをどこか長く持続させる必要があります。 – ikegami
[参考文献](https://stackoverflow.com/questions/13415321/difference-between-static-auto-global-and-local-variable-in-the-context-of-ca) – ikegami