通常我们以以下格式声明数组:
DataType array_name[SIZE];
所以如果我尝试为例如创建 0 长度数组
int arr[0]; //Line#1
arr[0] = 5; //Line#2
执行上述代码时,我没有收到任何错误。在这种情况下,是否为单个整数分配了内存?
为什么 Line#1 不会产生任何编译错误?
理想情况下,它应该!在本地存储上
创建大小数组不是合法代码。
理想情况下,编译器应该向您发出错误,可能某些编译器扩展允许它编译,但根据标准,这不是有效代码。尝试使用.0
-pedantic
参考:
C++03 标准 8.3.4/1:
如果 _constant-expression+ (5.19) 存在,它应该是一个整数常量表达式并且它的值应该大于零。
此外,
为什么 Line#2 不会产生任何编译错误?
因为超出分配数组的范围写入是未定义的行为。未定义的行为不需要编译器为您提供任何诊断。请注意,一旦代码表现出未定义的行为,实际上任何事情都可能发生,并且所有的赌注都被取消了。
您不会收到任何错误,因为 C/C++ 不对数组进行任何范围检查。 arr[10000000]
也不会给你可以编译的错误。
发生的事情是您正在向堆栈上不属于其中的某个位置写入一些内存,arr
谁知道会发生什么。它可能导致访问冲突和崩溃或随机损坏某些其他数据结构。
那是缓冲区溢出。