对编码来说是新近出现的问题

时间:2019-04-09 14:57:35

标签: c++ runtime-error

我是竞争编程的新手,我一直在尝试解决代码厨师的问题。当我尝试使用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

1 个答案:

答案 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;
}