- ベストアンサー
関数に値の代入 [C言語]
C言語初心者です。関数とポインタについて勉強していたのですが、ふと関数の型を知りたくなってVC++で型を調べてみたんです。そしたら、void型で引数のない関数の型は void (__cdecl*)() となっていました。voidと__cdeclはわかります。 そしてこれ型に*が入ってるじゃないですか。ということは関数はポインタということになると思います。なので私はもしかしたら値の代入ができるのではないか、と思ったのです。早速、 f1=f2;(f1とf2は型と内容の同じ関数) や、 (*f1)=(*f2); としてポインタの中身や参照先の関数の実態の値を処理中に書き換えてみようとしました。ですが、多分そうなるとは思ったのですが、コンパイルエラーが出ました。 《エラーの内容》 error C2106:'=':左のオペランドが、左辺値になっていません。 warning C4550:式は引数リストのない関数として評価します。 関数を書き換えようとすること自体馬鹿げていることは重々承知です。でも、微かにいけそうな気がするんですよ。代入させたくないなら関数の型は一律constにすると思うし(実際関数をconstをつけて宣言してもOKだった、(プロトタイプ有り無しでも))、関数への代入は問答無用で駄目なのならばそういうエラーメッセージを出すと思うんです。 関数の書き換えは100%無理でしょうか?それとも関数を書き換える方法があるでしょうか?回答よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
お礼
関数の型はわざと型を調べたい変数にその型に変換できない型の変数を代入して、それをコンパイルして出てきたエラーメッセージから調べました。 >>関数の書き換えは不可能ではありません 関数の実装を書き換えることができました!char型のポインタに関数のアドレスを代入して、そのポインタ経由で値を代入するソースを書いてコンパイルしたら、ワーニングメッセージしか出ませんでした。ただ、適当な値を書き込んだので実行したら案の定プログラムが停止しました(汗)。もし、うまい位置に機械語の命令の値を代入したら「プログラムの処理中に関数を書き換える」みたいなトリッキーなプログラムも書けたりするのかな・・・? >>関数へのポインタ型に暗黙的に型変換されます。 配列と似ているんですね!違うところもありますが。 回答ありがとうございました!