「チェックポイント」まで、メモリ位置0x200にアクセスしていないため、すべてが正常に機能します。
x
関数にローカル変数がありますmain
。これは「intへのポインタ」タイプです。x
値0x200が割り当てられ、その値が出力されます。ただし、xのターゲットにはアクセスされていないため、これまでx
は、有効なメモリアドレスを保持しているかどうかは関係ありません。
次にscanf
、渡したメモリアドレス(に格納されている0x200)に書き込もうとしますx
。次に、セグメンテーション違反が発生します。これは、任意のメモリアドレスに書き込もうとした結果である可能性があります。
それで、あなたの疑問は何ですか?明らかに機能しないこのコードに出くわしたときに、これが機能する可能性があると思われる理由は何ですか?
特定のメモリアドレスへの書き込みは、特定の条件下で機能する可能性がありますが、一般的にはほとんど機能しません。最近のすべてのOSでは、通常のプログラムはメモリレイアウトを制御できません。OSは、プログラムのコード、スタック、グローバルなどの最初のものがどこに行くかを決定します。OSもおそらくある程度のメモリスペースを使用しているので、何を使用しているかを通知する必要はありません。代わりに、(変数を作成するか、メモリ割り当てルーチンを呼び出すことによって)メモリを要求し、それを使用します。
したがって、特定のアドレスに書き込むと、割り当てられていないメモリ、または他の目的で使用されているメモリが取得される可能性が非常に高くなります。実際に書き込み可能なアドレスをヒットしたとしても、どちらも適切ではありません。プログラムの他の変数の1つで使用されるデータの一部を壊してしまうとどうなりますか?または、プログラムの他の部分が、今書いた値を覆い隠しますか?
ハードコードされた特定のメモリアドレスを選択することは絶対に避けてください。変数であることがわかっているアドレス、またはなどから取得したアドレスを使用する必要がありますmalloc
。