下記のプログラムはprintfでaのアドレスを表示させると、
mainでfの引数に入れた数字が出力され、表示させないと不定値が出力されます。
aのアドレスを表示させるとなぜ引数の値が出力されるのでしょうか?
メモリ解放はされないのでしょうか?
出力例
printfあり
----------------------------------------
0x7ffd72e66b74 = 2
printfなし
----------------------------------------
-753662152
ソース
----------------------------------------
#include <stdio.h>
int *f(int x){
int a = x;
printf("%p = ", &a); //ココの有無で値が変わる
return &a;
}
int main(void){
printf("%d", *f(2));
}
printfの有無で値が変わる
Re: printfの有無で値が変わる
ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
その上で、おそらく最適化の影響で実行結果が変わっているのでしょう。
どうして今回たまたまこういう結果になったのかを調べるには、コンパイラにアセンブリ言語を出力させてどうなっているか見てみるといいかもしれません。
まず言えることは、このコードはスコープを抜けて既に消滅した変数へのポインタをデリファレンスしているので、未定義動作を起こします。サバ味噌 さんが書きました:下記のプログラムはprintfでaのアドレスを表示させると、
mainでfの引数に入れた数字が出力され、表示させないと不定値が出力されます。
aのアドレスを表示させるとなぜ引数の値が出力されるのでしょうか?
その上で、おそらく最適化の影響で実行結果が変わっているのでしょう。
どうして今回たまたまこういう結果になったのかを調べるには、コンパイラにアセンブリ言語を出力させてどうなっているか見てみるといいかもしれません。
オフトピック
厳密には、void*型のデータを要求する%pにint*型のデータを渡すのも、型が違うので未定義動作です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: printfの有無で値が変わる
初めて質問したので、勝手がわからずご迷惑をお掛けしてすみません。
次からは気をつけます。
最適化なんて意識したことがなかったので勉強になりました。
ありがとうございました。
次からは気をつけます。
最適化なんて意識したことがなかったので勉強になりました。
ありがとうございました。
Re: printfの有無で値が変わる
ソースコードの臭いところをかぎ分けることも重要です。サバ味噌 さんが書きました: #include <stdio.h>
int *f(int x){
int a = x;
printf("%p = ", &a); //ココの有無で値が変わる
return &a;
}
int main(void){
printf("%d", *f(2));
}
スタック変数のイメージを即席で作りましたので、参考にしていただければと思います。
(注意)実際とはだいぶ異なります。あくまで、イメージです。