printfの有無で値が変わる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
サバ味噌

printfの有無で値が変わる

#1

投稿記事 by サバ味噌 » 8年前

下記のプログラムは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));
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: printfの有無で値が変わる

#2

投稿記事 by みけCAT » 8年前

ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
サバ味噌 さんが書きました:下記のプログラムはprintfでaのアドレスを表示させると、
mainでfの引数に入れた数字が出力され、表示させないと不定値が出力されます。
aのアドレスを表示させるとなぜ引数の値が出力されるのでしょうか?
まず言えることは、このコードはスコープを抜けて既に消滅した変数へのポインタをデリファレンスしているので、未定義動作を起こします。
その上で、おそらく最適化の影響で実行結果が変わっているのでしょう。
どうして今回たまたまこういう結果になったのかを調べるには、コンパイラにアセンブリ言語を出力させてどうなっているか見てみるといいかもしれません。
オフトピック
厳密には、void*型のデータを要求する%pにint*型のデータを渡すのも、型が違うので未定義動作です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

サバ味噌

Re: printfの有無で値が変わる

#3

投稿記事 by サバ味噌 » 8年前

初めて質問したので、勝手がわからずご迷惑をお掛けしてすみません。
次からは気をつけます。

最適化なんて意識したことがなかったので勉強になりました。
ありがとうございました。

あんどーなつ
記事: 171
登録日時: 8年前
連絡を取る:

Re: printfの有無で値が変わる

#4

投稿記事 by あんどーなつ » 8年前

サバ味噌 さんが書きました: #include <stdio.h>
int *f(int x){
int a = x;
printf("%p = ", &a); //ココの有無で値が変わる
return &a;
}

int main(void){
printf("%d", *f(2));
}
ソースコードの臭いところをかぎ分けることも重要です。
スタック変数のイメージを即席で作りましたので、参考にしていただければと思います。
(注意)実際とはだいぶ異なります。あくまで、イメージです。
001.png
001.png (10.96 KiB) 閲覧数: 3061 回

閉鎖

“C言語何でも質問掲示板” へ戻る