竞赛编程新手遇运行时错误:本地正常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
相关产品推荐
相关产品推荐

