我按如下方式编写了一个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 character。 不可打印的字符,其十六进制值为7F。
我的问题是: -
这个疑问得到了这样一个事实的支持:array1和array2中没有NULL终止符,为什么只有在array2的输出之后才有垃圾值呢?
那么,GCC会检查数组边界吗?
答案 0 :(得分:4)
network
出于纯粹的坏运气,它不打印垃圾;碰巧有一个零字节。您正在调用未定义的行为,因此允许任何结果。
C编译器会检查是否有过长的初始化程序,但显然有义务允许“无终止空”版本(尽管它们仍然可以发出警告,但通常不会;但GCC 4.7.1不会)。
对于一般数组访问,编译器通常不检查数组边界,但有时您可以在某些情况下从GCC 4.7.1获取信息(需要很多选项,包括-O
进行优化)。
答案 1 :(得分:2)
您正在利用未定义的行为,任何事情都可能发生。
答案 2 :(得分:1)
使用太长的字符串初始化char数组时,使用未定义的行为。这意味着即使出现正确的值,任何事情都可能发生。