1

所以我的代码是

#include <stdio.h>
#include <string.h>
int main()
{
    const char *a="123456789abcdef";
    char b[10];
    int i=0;
    while((b[i]=a[i])!='\0')
        ++i;
    printf("%s, %d\n",b,strlen(b));
    return 0;
}

该代码存在数组b的数组溢出,但是当我在我的系统(64位ubuntu 12.04 lts)中使用gcc(版本4.6.3)编译它时,它成功了。

这个程序的输出是123456789abcdef,15返回
0表示这个程序正常退出。

不知道是我的编译器的问题还是我的系统的问题,有人可以告诉我吗?PS它似乎只出现在带有gcc的64位linux中。这是一个错误吗?

4

1 回答 1

7

在 C 中不检查数组访问。如果像这样溢出缓冲区,结果是未定义的行为。防止这种情况是程序员的责任,而不是编译器的责任。

虽然有一些工具可以帮助检查无效的内存访问。就像 Valgrind 在运行时这样做,以及 Clang 的静态分析器用于编译时检查。

于 2013-01-19T09:07:06.603 回答