私は以下のコードでリンクリストを作成しました。ご覧のとおり、mallocを使用してサイズ3のリストを作成しました。しかし、サイズ10以上のforループを実行して初期化して印刷しました。私がコンパイルしたコードを実行すると、取得した結果がCリンクされたリストのサイズはmallocによって制限されていません
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
struct node {
int value;
struct node *next;
};
int main() {
//code
struct node **head;
struct node *curr;
curr = (struct node *) malloc(sizeof(struct node)*3);
head = &curr;
printf("done 1\n");
(*head)->value = 0;
(*head)->next = NULL;
for(int i = 1; i < 10; i++) {
(*head+i-1)->next = (*head+i);
(*head+i)->value = i;
(*head+i)->next = NULL;
}
curr = *head;
printf("done 2\n");
for(int i = 0; i < 10; i++) {
printf("%d\t", (*head + i)->value);
//curr = curr->next;
}
printf("\ndone 3\n");
//free(curr);
return 0;
}
、
done 1
done 2
0 1 2 3 154208560 842282289 876087600 154744882 808859448 875837236
done 3
なぜ私は第四ノードに値を割り当てると、私は実際にサイズ3のリストを作成したときにそれをアクセスすることができています?
ごみの値が5番目から10番目のノードアクセスから印刷されていることがわかりました。しかし、第4ノードはどのように作成されていますか?
P.S:
私は10!= 3であることを知っています。ループをその限界に置くと、コードが正しく実行されました。私は外出時に何が起こるかを見たいと思っていました。私は実際にサイズ3のリストを作成したときに値を割り当てることができたので、第4ノードも作成されていることがわかりました。
これは純粋にsegフォルトを取得するかどうかを確認することです。
'10!= 3' ...私はあなたのコードを正しく理解しています。 – wildplasser
割り当てられたメモリの終わりを超えてアクセスすることは[未定義の動作](https://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior)です。働くように見えるなど、何かが起こる可能性があります。 – user3386109
それは?私はそれを知らなかった! 私は10!= 3を知っています。ループをその限界に置くと、コードが正しく実行されました。私は外出時に何が起こるかを見たいと思っていました。私は、実際にサイズ3のリストを作成したときに値を割り当てることができたので、第4ノードも作成されていることがわかりました。 – Aspirant9