关于数组越界

P1001 A+B Problem

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 不同环境下对数组越界的判断精确度不一,在我印象中,洛谷就不算很精确……

如果你把上述的 10 改成 1000 就会 RE。


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] 被储存在了哪里呢?是储存在了一个未被定义的地址?


上一页 | 下一页