次のコードで、何も表示されない理由は、get_message() によって返されたポインタが範囲外であるためです。
char *get_message() {
char msg [] = "Aren’t pointers fun?";
return msg ;
}
int main (void) {
char *foo = get_message();
puts(foo);
return 0;
}
gdb で実行すると、foo の位置のデータが文字列 "Aren't pointers fun?" であることがわかります。
Old value = 0x0
New value = 0x7fffffffde60 "Aren’t pointers fun?"
(これは、スコープ外に渡されたポインターのデータがメモリに残るという回答と一致しているようです)が、「プット」のドキュメントには、最初のデータが指定されたアドレスからコピーされると記載されています。この場合、おそらく 0x7ffffffffde60 です。
したがって、何も出力されないのはなぜですか?
編集: ご回答ありがとうございます: 元のコードを gdb で完全に実行しました。puts の呼び出しは、foo が保存されたアドレスのデータを実際に変更します。
(gdb) p foo
$1 = 0x7fffffffde60 "Aren’t pointers fun?"
(gdb) n
11 return 0;
(gdb) p foo
$2 = 0x7fffffffde60 "`\336\377\377\377\177"
興味深いことに、change_msg() のコードを次のように変更すると、コードはメッセージを出力しました。
char *get_message() {
char *msg = "Aren’t pointers fun?";
return msg ;
}
この場合、foo のデータ (アドレス 0x4005f4 - アドレスのサイズが小さいことに何か意味があるのでしょうか?) は、コード全体で同じままです。これが動作を変更する理由を見つけるのは素晴らしいことです