Cがスタックに変数を割り当てる方法を確認するために、いくつかの実験を行っています。次のコードで奇妙な動作が発生しています。C はスタックを下向きに成長させているように見えるため、次の例では、短い s の直前のバイトに char c が割り当てられます。次に、int ポインターbigRandP
を作成し、c が占める位置と同じ場所を指すようにします。そのため、"int" は、s が占めるスタック上のスペースと重なります。次に、int ポインターが参照する場所に何かを割り当てようとします。
unsigned short nameSum = 0;
unsigned char smallRand = 0;
unsigned int* bigRandP;
//The "int" pointed to by iP should overlap s
bigRandP = (unsigned int*)(&smallRand);
printf("%p %p %p\n", &nameSum, &smallRand, bigRandP);
printf("%u %u %u\n", smallRand, nameSum, *bigRandP);
*bigRandP = 0;
printf("%p %p %p\n", &nameSum, &smallRand, bigRandP);
printf("%u %u %u\n", smallRand, nameSum, *bigRandP);
0028FF1A 0028FF19 0028FF19
0 0 419430400
0028FF1A 0028FF19 0028FF00
0 0 4210788
印刷結果は興味深いものです。割り当てが失敗するだけでなく (bigRandP が指す int が 0 に設定されていない)、int ポインター自体がサイレントに再配置され、スタックのさらに下の別の場所を指します。何が起こっている?これは、重複するポインタで他の変数を上書きしないようにする C コンパイラの方法ですか?