1

次のコードを書いているときにエラーが発生するはずです。配列サイズはゼロ(私は違法だと思います)として与えられ、さらにsprintfはメモリが割り当てられていないaに「abc」を出力していますが、出力は「abc」として取得しています。理由がわかりませんか?

#include<stdio.h>
#include<string.h>
int main()
  {
    char a[0];
    sprintf(a,"%s","abc");
    printf("%s\n",a);
    return 0;
  }

配列サイズを1,2,3にすると、正しい出力が得られます。これは、aをポインターとして明示的に使用する、つまりchar * a(予期される)を使用するためのセグメンテーション違反を与える場合には当てはまりません。 )。誰かが内部の働きを説明できますか?

4

1 に答える 1

4

いいえ、合理的な説明はありません。印刷する文字列よりも小さい配列を使用することにより、プログラムは未定義の動作を呼び出します。つまり、すべてが正常に機能しているように見えるという事実を含め、文字通り何でも起こり得るということです。未定義の動作は、プログラムがクラッシュする必要があることを意味するのではなく、クラッシュする可能性があることを意味します。

于 2013-03-17T13:25:16.837 に答える