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

Why is there runtime-error? I have already set long int

本文关键字:设置 运行时错误 为什么      更新时间:2023-10-16
#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 的写入无效...为什么?

长根[a];

它是可变长度数组。这不是C++标准的一部分。(但是GNU编译器确实支持它。它是 C99 和 C11 可选的一部分(。不知道它是如何实现的。但不管它是什么,它都不能包含这么多长整数。

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

你说你用了长 int。但在大多数编译器中,intlong 之间没有区别(尽管它可能与这个问题无关(。

并且足够大的数据范围会让你调用递归函数的次数过多,这可能会导致堆栈溢出