GCC检查数组边界吗?

时间:2013-01-14 07:48:40

标签: c linux gcc

我按如下方式编写了一个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。

这个疑问得到了这样一个事实的支持:array1和array2中没有NULL终止符,为什么只有在array2的输出之后才有垃圾值呢?

那么,GCC会检查数组边界吗?

3 个答案:

答案 0 :(得分:4)

network出于纯粹的坏运气,它不打印垃圾;碰巧有一个零字节。您正在调用未定义的行为,因此允许任何结果。

C编译器会检查是否有过长的初始化程序,但显然有义务允许“无终止空”版本(尽管它们仍然可以发出警告,但通常不会;但GCC 4.7.1不会)。

对于一般数组访问,编译器通常不检查数组边界,但有时您可以在某些情况下从GCC 4.7.1获取信息(需要很多选项,包括-O进行优化)。

答案 1 :(得分:2)

您正在利用未定义的行为,任何事情都可能发生。

答案 2 :(得分:1)

使用太长的字符串初始化char数组时,使用未定义的行为。这意味着即使出现正确的值,任何事情都可能发生。