1

プログラムは次のとおりです。

#include<stdio.h>
int main()
{
   int a[7]={1,2,3,4};
   printf("%d%d%d%d%d",(*a),*(&*a),a[*a*0],*a);
   return 0;
}

codepad.org の出力は次のとおりです: 11110

ideone.com の出力は次のとおりです

私は個人的なgcc出力でそれを実行しました:11110私は最新のgccを持っていません

ステートメントでは、最初の 4は完全に明白なので、printf();私は気にしません。気%dになる5つ目。 %dなぜこのような出力が得られるのでしょうか?

4

1 に答える 1

9

関数への呼び出しが明らかに提供していない、想定される「5番目のパラメーター」があるオフセットで、printf() への呼び出しのスタックにたまたまあったデータにアクセスしようとします。

  • 感触をつかむには、可変個引数関数の書き方を学んでください。
  • それを本当に理解するには、アセンブリを学ぶ必要があります。
  • このようなプログラミングの間違いを避けるには、-Wallパラメーターを使用します。
$ gcc -Wall main.c 
main.c: In function ‘main’:
main.c:5:4: warning: format ‘%d’ expects a matching ‘int’ argument [-Wformat]
于 2012-06-09T18:23:54.633 に答える