1

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

DataType array_name[SIZE];

所以如果我尝试为例如创建 0 长度数组

int arr[0]; //Line#1
arr[0] = 5; //Line#2

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

4

2 回答 2

7

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

参考:

C++03 标准 8.3.4/1:

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

此外,
为什么 Line#2 不会产生任何编译错误?
因为超出分配数组的范围写入是未定义的行为。未定义的行为不需要编译器为您提供任何诊断。请注意,一旦代码表现出未定义的行为,实际上任何事情都可能发生,并且所有的赌注都被取消了。

于 2012-04-27T15:21:13.223 回答
4

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

发生的事情是您正在向堆栈上不属于其中的某个位置写入一些内存,arr谁知道会发生什么。它可能导致访问冲突和崩溃或随机损坏某些其他数据结构。

那是缓冲区溢出。

于 2012-04-27T15:18:09.527 回答