は二つの整数から成ります。その場合のxyz.a
は無視されます。なぜなら、それはprintf
が気にするスタック領域を超えているからです。
動作は未定義ですが(a)のprintf("%d %d",xyz,xyz.a);
文は、おそらくのようなスタック何かに上xyz
とxyz.a
をプッシュしているためので何かが起こることができることを、この特定のケースを説明することができます。
xyz.a | 10 | |
xyz | 20 | | Stack grows downward.
| 10 | V
とprintf
コード自体には、%d
の2つが与えられているため、下部に10が印刷され、20が印刷されます。つまり、フォーマット文字列とパラメータの不一致です。
%d
を追加すると、上の図の3番目の引数(実際には2番目の値)と思われるものが印刷されます。
この動作に依存することはお勧めできません。
pax$ cat qq.c
#include<stdio.h>
struct abc { int a; int b; } xyz;
int main (void) {
xyz.a=10;
xyz.b=20;
printf("%d %d",xyz,xyz.a);
return 0;
}
pax$ gcc -Wall -o qq qq.c
qq.c: In function 'main':
qq.c:6: warning: format '%d' expects type 'int',
but argument 2 has type 'struct abc'
qq.c:6: warning: format '%d' expects type 'int',
but argument 2 has type 'struct abc'
:あなたが潜在的なエラーとしてこれをキャッチするために、実際に
printf
引数の中を見
良いコンパイラgcc
のような:-)でも、奇数日には、おそらくコンパイラ、コンパイラのバージョン、またはを切り替えるとき、それは変更される可能性がありC99から
(A)、セクション7.19.6.1/9
:任意の引数は、対応する変換仕様の正しいタイプでない場合、動作は未定義です。
マインは '10 10'を返します。未定義の振る舞いに頼るのは良い考えではありません。 :) – sarnold
@sarnold、あなたの返品は10 10です。あなたは幸運だった、私の妻、二人の子供、犬、そして私のメインマシンを飲み込んだミニチュアブラックホールを作りました。私はこのコメントを私の古い386クランカーに入力しなければならない。さあ、私はその犬が恋しくなるつもりです:-) – paxdiablo
@paxdiabloあなたの犬についてお詫び申し上げます。 – sarnold