零大小的数组?

时间:2012-04-27 15:15:06

标签: c++ arrays size

通常我们按以下格式声明数组:

DataType array_name[SIZE];

SO如果我尝试为例如

创建0长度数组
int arr[0]; //Line#1
arr[0] = 5; //Line#2

执行上面的代码时,我没有收到任何错误。在这种情况下,是否为单个整数分配了内存?

2 个答案:

答案 0 :(得分:7)

为什么第1行不会产生任何编译错误?
理想情况下,它应该! 在本地存储上创建大小为0的数组不是合法代码 理想情况下,编译器应该向您发出错误,可能某些编译器扩展允许编译,但根据标准,这不是有效的代码。请尝试使用-pedantic进行编译。

参考:

C ++ 03标准8.3.4 / 1:

  

如果_constant-expression +(5.19)存在,它应该是一个整数常量表达式,其值应大于零。

此外,
为什么第2行不会产生任何编译错误?
因为超出分配数组范围的写入是未定义行为。未定义的行为不需要编译器为您提供任何诊断。请注意,一旦代码显示未定义的行为,字面意思就会发生任何事情,并且所有的赌注都会关闭。

答案 1 :(得分:4)

您没有收到任何错误,因为C / C ++没有对数组进行任何范围检查。 arr[10000000]不会给你编译错误。

你正在写一些内存的某些内存,而不是arr的一部分,并知道会发生什么。它可能导致访问违反并崩溃或随机破坏其他一些数据结构。

那是缓冲区溢出。