次のコード:別のCポインタ質問
int *a;
*a = 5;
最も可能性の高いセグメンテーションフォールトでの結果と私は理由を知っているだろう。
次のコード:
int a;
*a = 5;
もコンパイルされません。 (gcc:unary *の型引数が無効です)。
次に、ポインタは、単にアドレスを格納するため 使用される整数です。 私が言うのであれば、なぜそれが問題にする必要があります:
*a = 5;
理想的には、これはまた、セグメンテーションフォールトを生じるはずです。
ポインタは符号なし序数スカラーであり、必ずしも整数ではありません。 – fortran
一貫性/明快さのために、セグメンテーション違反がこのような状況での行動を考える過度に正確な方法ではないことに気づくことは価値がありません。任意のメモリアドレスを参照解除すると、Cでは未定義の動作になります。多くの場合、セグメンテーションフォールトが発生しますが、必須ではありません。それはバスエラーを引き起こすかもしれない(Mac OS Xはそれを好む)。そのアドレスが有効な場合は、そのアドレスの内容を表示することがあります。 –
'C'は正しく初期化されていないポインタを検出するのが難しいですが、' int'データ型の参照解除を検出しません。それをコンパイルしている間、あなたを止める。しかし、あなたは '*(unsigned int *)a = 5'でそれを強制することができ、おそらくあなたが期待するセグメンテーションフォールトを得ることができます。低い確率では、「a」はプログラムコンテキスト内のアドレス指定可能な場所に変換される値を持つため、あなたはあなたの欠点を逃してしまいますが、ランダムなアドレス指定の微妙な欠陥を達成するため、「多分」と言います。 – nik