You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

竞赛编程新手遇运行时错误:本地正常CodeChef报std::bad_array_new_length

解决CodeChef上的std::bad_array_new_length运行时错误

嘿,我一眼就揪出问题所在啦!你碰到的这个运行时错误,根源是数组下标越界破坏了内存结构,最终触发了std::bad_array_new_length异常——Dev C++的内存检查没那么严格所以没报错,但在线OJ的内存校验可是毫不留情的。

咱们来拆解你的代码问题:
你声明J=new int[n];,这意味着J数组的有效下标范围是0到n-1。但后面你写了这样的循环:

for (int j=1;j<n+1;j++) {
    J[j]=J[j-1]+(A[j-1]*B[j-1]);
}

当j循环到n的时候,你访问了J[n],这已经超出了J数组的边界(数组长度为n时,最大合法下标是n-1)。这种越界操作会乱改堆内存的元数据,直接触发了异常。

修复方案超简单:

把J数组的长度改成n+1,这样就能容纳J[0]到J[n]的所有元素了:

J=new int[n+1];

另外还有个可以简化的小细节:你写的if (r==1)判断完全多余,因为当r=1时,J[r]-J[l-1]就是J[1]-J[0],而J[0]初始化为0,结果和J[1]完全一致,直接删掉这个分支就行:

C[i]=J[r]-J[l-1];

修复后的核心代码片段大概是这样:

cin >> n >> q;
A=new int[n];
B=new int[n];
J=new int[n+1]; // 这里改成n+1
C=new int[q];

// 输入A、B数组的代码不变

J[0]=0;
for (int j=1;j<=n;j++) { // 写成j<=n比j<n+1更直观
    J[j]=J[j-1]+(A[j-1]*B[j-1]);
}

for (int i=0;i<q;i++) {
    cin >> l >> r;
    C[i]=J[r]-J[l-1]; // 去掉多余的if判断
}

// 输出和内存释放的代码不变

这样修改后,应该就能在CodeChef上正常运行啦!

内容的提问来源于stack exchange,提问作者chittari akash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:50:48