C言語でリターンアドレスをいじって挙動を確認していたのですが
以下のコードでわからないところがあるのでお願いします。
c
1#include <intrin.h> 2#include <stdio.h> 3void* __stdcall f1() 4{ 5 puts(__FUNCTION__); 6 return _ReturnAddress();//返り値としてリターンアドレスを返す。 7} 8void* __stdcall f2(void* p) 9{ 10 puts(__FUNCTION__); 11 *(void**)_AddressOfReturnAddress() = p;//リターンアドレスをf1のものへ変える。 12 return 0; 13} 14 15int main() 16{ 17 void* p = f1();//ポインタpにf1のリターンアドレスを代入。 18 printf("リターンアドレスは・・・%p\n",p); 19 f2(p);//f2関数の引数にf1のリターンアドレスを指定。 20 return 0; 21}
実行すると
c
1f1 //f1が実行されて f1 を表示 200FE1DADf2// f1のリターンアドレス 300000000f2// f2のリターンアドレスをf1のリターンアドレスに変えたら・・・ 4
なぜ2回目の表示でリターンアドレスを代入したポインタpの
値が変わるのかが理解できません。
リターンアドレスはその関数の処理が終わったときに次に処理したい関数のアドレスを
指定するものですよね?
なら、1回目のポインタpへの代入以降
値は変わらないと思うのですが。
c
100FE1DADf2 200FE1DADf2
このようになることを期待したのですが・・・。
分からないので参考になるリンクまたは説明をお願いします。
c
1#include <intrin.h> 2#include <stdio.h> 3void* __stdcall f1() 4{ 5 puts(__FUNCTION__); 6 return _ReturnAddress(); 7} 8void* __stdcall f2(void* p) 9{ 10 puts(__FUNCTION__); 11 *(void**)_AddressOfReturnAddress() = p; 12 printf("f2関数内・・・%p\n",p); 13 return 0; 14} 15 16int main() 17{ 18 void* p = f1(); 19 printf("リターンアドレスは・・・%p\n",p); 20 f2(p); 21 return 0; 22} 23
c
1f1 2リターンアドレスは・・・00A61DAD 3f2 4f2関数内・・・00A61DAD 5リターンアドレスは・・・00000000 6f2 7f2関数内・・・00000000
「初心者」がやるべきことではないのではないと思うのですが(なんのためにこれを実行しようとしましたか?)。
他のサイトでリターンアドレスについて質問したところ
リターンアドレスがどういうものか理解できるように・・・ということで
サンプルコードをいただきました。
そのコードの意味が分かってきたので
少しだけコードを変更したところ、今の不明点にいたります。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13213483518
とかそれ以降の流れですね。その情報無しで欲しい回答が得られそうに思いますか?
もはや入門書のレベルを完全に超えているんですけど、せめて入門書を一通り終えてからいろいろ手を出そう、という話をしてませんでしたっけ?
一応やったのですが
その入門書(苦しんで覚えるC)自体には
「リターンアドレス」
の説明がなかったです。
リターンアドレスについてぐぐったりしたのですが
出てくるのがバッファオーバーフローや
手紙とかのリターンアドレスだったりで
うまく情報を集められなかったので質問しました。
回答3件
あなたの回答
tips
プレビュー