次のように C プログラムを作成し、GCC バージョン 4.6.3 を使用してコンパイルしました。
#include <stdio.h>
int main(void)
{
char array1[7] = "network"; // no space for \0 in array here
char array2[5] = "network"; // even here, no space for \0 in array
printf("1. %s\n",array1);
printf("2. %s\n",array2);
return 0;
}
コンパイル時:-
warning: initializer-string for array of chars is too long [enabled by default]
プログラムの出力は次のとおりです:-
1. network
2. netwo
array2 の出力:- netwo+unprintable 文字。16 進値 7F を持つ印刷不能文字。
私の質問は:-
- array1 の値を出力しているときに、array2 を出力する場合のように、「ネットワーク」を出力した後にガベージ値を出力しないのはなぜですか。
この疑問は、配列 1 にも配列 2 にも NULL ターミネータがないという事実によって裏付けられています。なぜ、配列 2 の出力の後にのみ値がガベージになるのでしょうか?
では、GCC は配列の境界をチェックしますか?