为什么会出现运行时错误?我已经设置了long int

时间:2019-02-05 12:02:39

标签: c++ runtime-error

#include <stdio.h>

long equation(long x){
  return x*x+x;
}

long BinarySearch(long arr[],long start,long end,long k){

  if(start==0 && end==0){
    return 0;
  }
  else if((end-start)<=5){
    for(int i=start;i<=end;i++){
      if(arr[i]<=k && arr[i+1]>k){
        return i;
      }
    }
  }
  else{
    long mid=(start+end)/2;
    if(arr[mid]==k){
      return mid;
    }
    else if(arr[mid]>k){
      return BinarySearch(arr,start,mid-1,k);
    }
    else{
      return BinarySearch(arr,mid+1,end,k);
    }
  }

}

int main() {

  long a;
  scanf("%ld",&a);
  long roots[a];
  for(long i=0;i<a;i++){
    roots[i]=equation(i);
  }

  printf("%ld",BinarySearch(roots,0,a-1,a));

  return 0;
}

对于较小的数字(小于100000000),此代码有效,但超过100000000,此代码具有运行时错误。我将每个变量都设置为一个长整数。我使用了c ++导师,它说长方程的步骤有问题。大小8的写入无效...为什么?

1 个答案:

答案 0 :(得分:0)

  

长根[a];

它是 variable length array 。这不是C ++标准的一部分。 (但是GNU编译器确实支持它。它是C99和C11- 可选的一部分)。不知道它是如何实现的。但是无论如何,它都不能包含那么多长整数。

让我们做一个数学问题。假设1MB = 10**6 Bytes的long int大小为4字节,则100000000 long占用400MB内存。我认为它不能存储在通常为4MB的堆栈中。

您说您已经使用了long int 。但是在大多数编译器中,intlong之间没有区别(尽管可能与这个问题无关)。

足够大的数据范围使您多次调用递归函数,这可能导致 stack overflow