一般来说,我们在声明格式如下数组:
DataType array_name[SIZE];
所以,如果我试图创建0例如长度数组
int arr[0]; //Line#1
arr[0] = 5; //Line#2
我没有得到任何错误,当上面的代码是executed.In这种情况下,对于一个整数内存分配?
一般来说,我们在声明格式如下数组:
DataType array_name[SIZE];
所以,如果我试图创建0例如长度数组
int arr[0]; //Line#1
arr[0] = 5; //Line#2
我没有得到任何错误,当上面的代码是executed.In这种情况下,对于一个整数内存分配?
为什么1号线不产生任何编译错误?
理想情况下,它应该!
这是不合法的代码创建数组的大小0
本地存储。
理想情况下,编译器应该发出你的错误,可能是一些编译器扩展允许这种编译,但按照标准,这不是一个有效的code.Try与编译-pedantic
。
参考:
C ++ 03标准8.3.4 / 1:
如果_constant表达+(5.19)时,它应是一个积分常数表达式,其值应大于零。
进一步,
为什么2号线不产生任何编译错误?
因为写超出分配的数组的边界是未定义的行为 。 未定义的行为并不需要编译器为您提供任何诊断。 需要注意的是,一旦代码表现出未定义行为字面上任何事情都有可能发生,全盘皆输。
因为C / C ++不会做阵列的任何范围检查,你没有得到任何错误。 arr[10000000]
不会给你可以编译错误。
会发生什么事是你的,它不是一部分上写一些记忆一些地方arr
,谁知道会发生什么。 这可能导致访问违反和崩溃或随机腐败的一些其他数据结构。
这是一个缓冲区溢出。