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