关于数组越界

回复帖子

@c_x_c 2019-07-12 10:00 回复

由一道题目联想到的问题,题目描述戳这里,我用了一个简单快捷的打表程序:

#include<bits/stdc++.h>
using namespace std;
int a[1000001],n,c[5]={1,5,10,25,50};
int main(){
    a[0]=1;
    for(int i=0;i<=4;i++){
        for(int j=1;j<=7849;j++){
            a[j]+=a[j-c[i]];
        }
    }
    while(cin>>n) cout<<a[n]<<endl;
    return 0;
}

很明显我们会发现,a[j-c[i]]会数组越界,可是输出的结果却与题解中这位dalao的结果一样:

#include<bits/stdc++.h>
using namespace std;
int c[5]={1,5,10,25,50};
int n,i,j,dp[10001];
int main(){
    dp[0]=1;
    for(i=0;i<=4;i++){
    for(j=c[i];j<=7499;j++){
    dp[j]+=dp[j-c[i]];
    }}
    while(cin>>n){
    cout<<dp[n]<<endl;
    }
    return 0;
}

这是为什么?求解释

@zhaojinxi 2019-07-12 10:43 回复 举报

@c_x_c 在windows下,系统保护进程不会太严格,对于数组的小范围越界,可能会正常运行,也可能会出错。并且,MinGW编译器会在数组的两边保留一些空间,也就是防止像a[-1]这样的小范围越界,但是如果像a[-100]这种大范围越界,谁也救不了你。

你这样的代码只能在windows系统下运行(还要看你RP),在linux系统下绝对会RE

反馈
如果你认为某个帖子有问题,欢迎向洛谷反馈,以帮助更多的同学。



请具体说明理由,以增加反馈的可信度。