printfにおける%dと引数

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

printfにおける%dと引数

#1

投稿記事 by アス » 15年前

質問させていただきます。
以下のコード

printf("りんご%d個,オレンジ%d個" ,3);

としたとき、表示される文字列は

-りんご3個,オレンジ44121754個-

と表示されます。
printf関数の第三引数に二つ目の%d,に入る整数が指定されていないことがこのバグの原因なのは分かっています。
しかし、今回は44121754という数値の正体を知りたいので投稿させていただきました。

この値はintの値の範囲内ですから、%dにはint型の値が入ったものと思います。
また、変数を初期化せずに表示した場合も同じように意味不明な数字が出てくることから、どこかで変数が暗に宣言されたのか。
もしくは、暗に4バイト(intのもつメモリの長さ)のメモリを確保して、二番目の%dに入っているのか。
自分の考えは以上です。

しかし、どちらが正しいか分からず、ひょっとするとどちらも間違えなのかも。
ご回答よろしくお願いします。

YuO

Re:printfにおける%dと引数

#2

投稿記事 by YuO » 15年前

たまたま,引数の位置に相当する情報をメモリから読み込んだら,その値だっただけです。
# 未定義動作なので,記憶域にメモリを使うなどの暗黙の仮定を置いています。

一般的に使われる,引数をスタックに載せる実装の場合,スタックは固定で確保されていることが普通です。
引数や関数の戻り先などは,固定されたスタックに順番に書き込まれていきます。
しかし,関数から戻った場合に,スタックの値を元に戻したり,何らかの値で上書きするなどの処理はおこなわれません。
結果,今回のような場合は,その引数の位置に相当するスタックメモリに書き込まれていた値が読まれることになります。

たかぎ

Re:printfにおける%dと引数

#3

投稿記事 by たかぎ » 15年前

処理系不明では正確な回答は不可能です。
それを踏まえた上で...

コンピュータの動作原理をちゃんと理解することをお勧めします。
それともうひとつ、コンパイラが生成したコードを調べてみてください。
アセンブリ言語のソースを出力させるか、機械語を逆アセンブルするなどすれば確認できるはずです。

softya

Re:printfにおける%dと引数

#4

投稿記事 by softya » 15年前

たかぎさんの言われる通り処理系不明ですが、Windowsだと仮定するとスタックから2つ目のint型引数があるものとして値を参照しています。スタックの値なので何が入っているかは不明ですね。
コールスタック/スタックフレームについて調べてみてください。
http://ja.wikipedia.org/wiki/%E3%82%B3% ... 3%E3%82%AF

たかぎ

Re:printfにおける%dと引数

#5

投稿記事 by たかぎ » 15年前

せめて確認に用いたソースがあれば、処理系不明の状況であっても、その値が何なのか、おおよその検討はつくんですけどね。

pie

Re:printfにおける%dと引数

#6

投稿記事 by pie » 15年前

おっと。
たかぎさんが誤字とはめずらしい。
弘法も筆の誤りというやつですね。
×検討はつく
○見当はつく
スレの主旨と関係なくてすいません。

たかぎ

Re:printfにおける%dと引数

#7

投稿記事 by たかぎ » 15年前

> たかぎさんが誤字とはめずらしい。

すみません。変換ミスですね。

アス

Re:printfにおける%dと引数

#8

投稿記事 by アス » 15年前

YuOさん、たかぎさん、softyaさん、pieさん、ご回答ありがとうございます。

実行環境はwindowsで、VC++2008express editionを使っています。

softyaさんのお勧めしてくれたwiki
http://ja.wikipedia.org/wiki/%E3%82%B3% ... 3%E3%82%AF
で調べて、それを基に考えるとprintfの引数領域は引数二つ分確保されたにも関わらず、引数が一つ足らなかった。
という解釈で間違っていないでしょうか。

コンピュータの動作原理、根本的なところが理解できていないことを痛感しました。
スタックやらヒープやらは一度、基本情報処理技術者試験の対策として学んだことはあったんですが、言語とのつながりは意識できていなかったようです。
これからもっとレベルアップしていくには避けては通れない道でしょうから、PCとC言語の密接なつながりの内容をより深く詰めていこうと決めました。
もし、何か補足をいただけるならばと欲張りながら思い、解決は1,2日延ばさせていただきます。
勝手ながらご容赦ください。
コメント・補足をお願いします。

たかぎ

Re:printfにおける%dと引数

#9

投稿記事 by たかぎ » 15年前

> コンピュータの動作原理、根本的なところが理解できていないことを痛感しました。
> スタックやらヒープやらは一度、基本情報処理技術者試験の対策として学んだことはあったんですが、言語とのつながりは意識できていなかったようです。
> これからもっとレベルアップしていくには避けては通れない道でしょうから、PCとC言語の密接なつながりの内容をより深く詰めていこうと決めました。

完全には網羅できませんが、下記のような記事を書いていますので、参考にしてみてください。
http://www.kijineko.co.jp/tech/creintro/stack.html
http://www.kijineko.co.jp/tech/pseudoprocessor

アス

Re:printfにおける%dと引数

#10

投稿記事 by アス » 15年前

たかぎさん、ご親切にありがとうございます。
リンク先の内容も、現在半分ほど読ませて頂いてます。
分かりやすく説明されているのに、分からない用語が多くて自分の無知さに呆れるばかりです(;><)
しかし、一つ一つ丁寧に知識を回収しようと思います。

これにて解決とさせていただきます。
ありがとうございました。


閉鎖

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