重複の可能性:
変数名を指定せずに %d を出力するときの printf の動作
たとえば、printf("%d %d"); を使用するとどうなりますか。? スタックから最後の 8 バイトをポップして出力するだけでしょうか?
重複の可能性:
変数名を指定せずに %d を出力するときの printf の動作
たとえば、printf("%d %d"); を使用するとどうなりますか。? スタックから最後の 8 バイトをポップして出力するだけでしょうか?
GCCでは-警告が表示されます(これはを使用して行われます__attribute__ ((__warn_unused_result__))
)。
x86では、呼び出し元がデータをスタックにプッシュし、関数が返された後にポップするため、スタックエラーは発生しません。これは、関数がスタックからデータをポップする(ret 10
たとえば、ASMで使用する)pascalとは異なり、C呼び出し規約と呼ばれます。
必要なデータの値はランダムになります。
技術的には、のフォーマット指定子printf()
の数が引数の数よりも多い場合の未定義の動作。
ただし、以下は問題ありません
printf("%d",x,y); // y is evaluated but not printed.
ガベージ値を出力しますが、「データ引数よりも多くの % 変換」という警告があります。
その場合、garbage data
コンパイラとそのコンパイルオプションに依存するものを取得します....