我是竞争编程的新手,我一直在尝试解决代码厨师的问题。当我尝试使用dev c ++编译器时,我没有遇到任何错误,但是我在在线代码厨师IDE上遇到了运行时错误
int main() {
int n,q;
int l,r;
int *A;
int *B;
int *J;
int *C;
cin >> n >> q;
A=new int[n];
B=new int[n];
J=new int[n];
C=new int[q];
for (int i=0;i<n;i++) {
cin >> A[i];
}
for (int i=0;i<n;i++) {
cin >> B[i];
}
J[0]=0;
for (int j=1;j<n+1;j++) {
J[j]=J[j-1]+(A[j-1]*B[j-1]);
}
for (int i=0;i<q;i++) {
cin >> l >> r;
if (r==1) {
C[i]=J[1];
}
else {
C[i]=J[r]-J[l-1];
}
}
for(int i=0;i<q;i++){
cout << C[i] << endl;
}
delete []A;
delete []B;
delete []C;
delete []J;
return 0;
}
在抛出'std :: bad_array_new_length'实例后调用terminate
what(): std::bad_array_new_length
答案 0 :(得分:2)
拥有
cin >> n >> q; A=new int[n]; B=new int[n]; J=new int[n]; C=new int[q];
您要检查是否输入了有效的尺寸,甚至没有输入
what():std :: bad_array_new_length
表示 n 和/或 q 的值对于new [n]
或new[q]
而言太大。如果您输入负整数(大小为 unsigned ),可能是这种情况,或者如果您未输入2个有效整数,因此至少一个var未被初始化(未定义),可能是这种情况行为),或者如果您输入至少一个非常大的整数。
通常,所有cin >> ...
都必须为if (!(cin >> ...)) { ...error management ... }
至少也要这样做:
if (!(cin >> n >> q) || (n < 1) || (q < 1)) {
cerr << "invalid sizes" << endl;
return -1;
}
拥有
J=new int[n]; ... for(int j=1;j<n+1;j++){ J[j]=J[j-1]+(A[j-1]*B[j-1]); }
J[j]
在最后一圈是J[n]
,因此您要从分配的数组中写出
也
for(int i=0;i<q;i++){
cin >> l >> r;
if(r==1){
C[i]=J[1];
}
else{
C[i]=J[r]-J[l-1];
}
您不检查 l 和 r 的值是否为有效索引,也不要检查整数是否为输入
cin >> l >> r;
可能类似于
if (!(cin >> l >> r) ||
(r < 0) || (r >= n) ||
(l < 1) || (l >= (n - 1))) {
cerr << "invalid indexes" << endl;
return -1;
}