int64 @ 2021-08-24 21:53:15
下面这段代码:
#include<iostream>
using namespace std;
int a[4];
int main() {
cin >> a[0] >> a[1];
a[10] = a[0] + a[1];
a[2] = a[10];
cout << a[2] << endl;
return 0;
}
明显 a[10] 超过了 a 定义的长度 4,但是为何没有影响程序并且 AC 了此题?
by int64 @ 2021-08-24 22:00:52
@王熙文 那 那个 a[10] 指向的变量的值是不是就被修改了?岂不是可以通过提交这种代码使他人的代码灵异 WA?
by tribool4_in @ 2021-08-24 22:01:04
@int64
大概就是编译器在定义a数组分配了一段长度为4的空闲空间,然后碰巧往后第10个位置是空闲的或不重要的,然后就过了()
by wsyhb @ 2021-08-24 22:03:03
@int64 不同环境下对数组越界的判断精确度不一,在我印象中,洛谷就不算很精确……
如果你把上述的
by Super_Supper @ 2021-08-24 22:03:50
@int64 本机试下?
by int64 @ 2021-08-24 22:07:06
VC 有 Warning 提示:
C6200:索引“10”超出了“0”至“3”的有效范围(对于非堆栈缓冲区“int * a”)。
C6386:写入到“a”时缓冲区溢出: 可写大小为“16”个字节,但可能写入了“44”个字节。
C6385:从“a”中读取的数据无效: 可读大小为“16”个字节,但可能读取了“44”个字节。
C6200:索引“10”超出了“0”至“3”的有效范围(对于非堆栈缓冲区“int * a”)。
by WYXkk @ 2021-08-24 22:07:10
“数组越界会 RE” 其实一个问题很大的说法,这里 RE 的直接原因从来不是数组越界,而是数组越界导致修改了对进程有影响的位置或者类似的东西。所以数组越界得到 AC,WA,TLE,MLE,RE 都是可能的。
by zimujun @ 2021-08-24 22:08:20
最后一个数组好像没啥问题(
by Sya_Resory @ 2021-08-24 22:10:48
草出现了!(什
orz wyx
by WYXkk @ 2021-08-24 22:10:57
因为标准没有规定变量存储的位置的分布方式,数组越界某种意义上可以理解为未定义行为。
by int64 @ 2021-08-24 22:13:31
@WYXkk 那请问代码中的 a[10] 被储存在了哪里呢?是储存在了一个未被定义的地址?