1

我编写了一个 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+不可打印的字符。具有十六进制值 7F 的不可打印字符。

我的问题是:-

  • 打印array1的值时,为什么打印“network”后不打印垃圾值,就像打印array2一样。

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

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

4

3 回答 3

4

network纯粹是运气不好,它不会打印垃圾;周围恰好有一个零字节。您正在调用未定义的行为,因此允许任何结果。

C 编译器确实检查过长的初始值设定项,但明确要求允许“不终止 null”版本(尽管他们仍然可以警告它,但通常不会;GCC 4.7.1 不会)。

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

于 2013-01-14T07:54:27.130 回答
2

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

于 2013-01-14T07:53:31.780 回答
1

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

于 2013-01-14T07:53:52.030 回答