いくつかのプログラムを実行すると、仮想アドレスは常に4の倍数(32ビットの仮想アドレスを仮定)であることに気付きました。例: 仮想アドレス:複数の4つのアライメント "〜の間のアドレス"への書き込み
- xff86c930 0xff86c934 ...
その差は常に4です:
int main()
{
int a = 7;
int b = 10;
printf("%p %p", &a, &b);
}
のようなものを与えるだろう。 は今、私はこれを試してみました:
int main()
{
int a = 7;
int b = 10;
int *y = &b;
int yi = (int)y;
yi--;
y = (int*)yi;
printf("%p %p: %d\n", &b, y, *y);
*y = 7;
printf("%p: %d\n", y, *y);
}
一例の出力は次のとおりです。
0xffe460a0 0xffe4609f:2807
0xffe4609f:7
ここで何が起こっていますか? 4の倍数ではないアドレスに何かを書き込もうとするときに参照されるものは何ですか?この2807はどこから来たのですか?ページフォールトはありますか?
'仮想アドレスは常に4の倍数です.'それは真ではありません –
これは未定義の動作と呼ばれます。無効なポインタになるように 'y'を操作しました。 – kaylum
@Lashaneはこのアーキテクチャを前提としています...これを私の質問に追加します。 –