4

ここで簡単な質問です。

印刷したい文字列でフォーマット指定子を使用するが、文字列の後にプレースホルダーを置き換える値をリストしない場合、2627389、6278253 などの一見乱数が出力として得られます。次に例を示します。

printf("%d %d %d");

出力は次のようになります。

2621244 4352722 1426724

なぜこのようなことが起こるのか、その数字が何を意味するのか疑問に思っていました。アイデアがあれば、本当に助かります。ありがとう。

4

2 に答える 2

3

ほとんどの場合、これらの数値は「ランダムな」値であり、プロセッサに応じてスタックまたはレジスタにたまたま存在します。昔は、関数のすべてのパラメーターがスタックに渡され、逆の順序でプッシュされていました。printf()の場合、最初のパラメーターと最後にプッシュされたパラメーターはフォーマット文字列になります。あなたの例では、スタックは次のようになります。

sp[0] = "%d %d %d"

printfは、スタックの最上位(フォーマット文字列)を取得して解析し、より高いスタック位置にある追加のパラメーターを取得し、フォーマット文字列に従ってフォーマットして適切に出力します。

printf( "%d%d%d"、1、2、3)などの整形式のprintf呼び出しがある場合、スタックは次のようになります。

sp[3] = 3
sp[2] = 2
sp[1] = 1
sp[0] = "%d %d %d"

printfは、期待どおりの動作をします。各フォーマット指定子の適切なスタック位置を取得し、適切にフォーマットします。他のパラメータを渡さない場合、それらのスタック位置にあるものはすべて代わりに出力されるため、「ランダム」な値になります。

于 2012-11-04T01:53:52.017 に答える
1

これは「未定義動作」と呼ばれます;)

せいぜい、あなたはゴミを得るでしょう。最悪の場合、実際にプログラムをクラッシュさせる可能性があります。

于 2012-11-04T01:55:55.073 に答える