質問: 「行 p1=(int *)malloc(sizeof(int)); と p2=(int *)malloc(sizeof(int)); を削除しても、出力は変わりません。理由を教えてください。 "
回答: p1 に a のアドレスを割り当ててから、現在 p1 に格納されているアドレスを p2 に割り当てるため、p1 と p2 に割り当てられたメモリをもう使用しないためです。
おそらくコード内でよりよく説明されています
int main()
{
int *p1,*p2; // define two pointers to int
int a; // define an int variable (space for an int in memory must be reserved)
p1=(int *)malloc(sizeof(int)); // get memory large enough for an int. (int *) makes the default return value of pointer to void a pointer to int
p2=(int *)malloc(sizeof(int)); // same thing but for the other point
p1=&a; // overwrite p1 and puts in it the address used for integer variable a
p2=p1; // overwrite p2 with what p1 has and that is the address of integer variable a
a=10; // now put where the integer variable a has its address the value 10 to
printf("\n%d\n",*p1); // output what p1 points to (and it points to address of integer variable a)
printf("\n%d\n",*p2); // same for p2
printf("\n%d\n",a); // just output a
return 0;
}
変数による追跡
int main()
{
int *p1,*p2;
int a; // &a = 0xDDDDDDDD
p1=(int *)malloc(sizeof(int)); // p1 = 0xAAAAAAAA
p2=(int *)malloc(sizeof(int)); // p2 = 0xAAAAAAAD
p1=&a; // p1 = 0xDDDDDDDD
p2=p1; // p2 = 0xDDDDDDDD
a=10; // a=10 (at address 0xDDDDDDDD)
printf("\n%d\n",*p1);
printf("\n%d\n",*p2);
printf("\n%d\n",a);
return 0;
}
アドレスがどのようa
にそのアドレスを取得したかについての 1 つの追加のメモ。これは、関数に入るときに作成され、終了時に破棄される自動変数です。したがって、a
宣言されているだけで何も割り当てられていませんが、メモリが割り当てられています。
K&R 付録 A からの引用
A4.1 ストレージ クラス
.. 自動オブジェクトはブロックに対してローカルであり、ブロックから出ると破棄されます。ブロック内の宣言は自動オブジェクトを作成します...