0

配列「chararray[3]」に3文字以上を格納できるのはなぜですか?たとえば、次のコードでは次のようになります。

#include <stdio.h>

char array[3];

main()
{
scanf("%s", array);
putchar(array[5]);
return 0;
}

任意の長さのテキストを入力でき、6番目の文字が印刷されます。"printf("%s "、array)を使用してテキスト全体を印刷することもできます。配列には3文字のスペースしかないのに、なぜこれが機能するのですか?

4

3 に答える 3

3

まだ上書きされていないため、コードは単語全体を印刷できます。あなたはメモリを設定し、すぐにそれから読み取ります。プログラムの実行の後半でそのメモリ位置から読み取ろうとすると、まったく異なる結果が得られる可能性があります。

これは未定義の動作です...そしてあなたの場合、それは「正しい」出力を出力しました。

于 2013-02-14T17:25:23.360 に答える
1

arrayはグローバル配列として定義されているため、通常は.bssセクションの一部になります。システムの.bssセクションには十分なメモリがあるため、同じメモリに書き込むことができます。明らかに、これは違反であり、このセクションのサイズを超えるとキャッチされます。

于 2013-02-14T17:25:58.740 に答える
0

scanf()の動作方法により、送信された内容をメモリに書き込み続けます。書き込み直後に読み取りを行っているため、配列で使用されている余分なメモリはまだ上書きされていないため、文字列全体を読み戻すことができます。
Cには、fgets()など、入力を制限する他の関数があります。

于 2013-02-14T17:30:04.523 に答える