15

すべてのプリミティブ データ型とオブジェクトにメモリが割り当てられていることを考えると、これらの型へのポインターを直感的に想像するのは簡単です。

しかし、関数ポインタは正確にはどこを指すのでしょうか? 命令が機械語に変換されてメモリに存在する場合、関数命令の開始に対応するメモリ位置を指していると考えるべきでしょうか?

不正なメモリアクセスが原因で、ポインターに多くのエラーが発生します。関数ポインタが命令メモリではなくデータメモリを指している場合、エラーが発生しますか?

4

5 に答える 5

32

関数ポインターもメモリを指します。唯一の違いは、データの代わりにそのメモリ位置に実行可能コードがあることです。

多くのプラットフォームでは、データ (通常のメモリなど) を実行しようとすると、クラッシュしたり、例外が発生したりします。これはデータ実行防止と呼ばれ、アプリケーションがマルウェアによって配置された可能性のある危険なコードを誤って実行するのを防ぐためのセキュリティ対策です。

于 2009-02-28T01:23:13.863 に答える
3

コードポインタです。関数のアドレスを指します。本質的にはあなたが説明したとおりです。はい、期待したものを指していないポインターがある場合は、問題が発生します。

于 2009-02-28T01:24:05.060 に答える
2

関数ポインターは、メモリ内の関数のアドレスを指します。

関数ポインターが通常割り当てられる方法に基づいて、データの場所を指している場合は驚くでしょう。それらは通常キャストされないため、有効な関数以外の場所を指すことはほとんどありません。それらをたくさんキャストしている場合、これは問題になる可能性があります。ただし、関数に渡すデータが間違っている可能性が高くなります。

于 2009-02-28T01:26:16.443 に答える
-3

よくわかりませんが、関数が命令(ADD、SUB、JMP)であり、それぞれに16進数値があることを考えると、関数を変更するのではなく、JMP命令()のみを変更すると思います...

于 2009-02-28T01:25:28.833 に答える