long int中cpp的分段故障高于999999

问题描述 投票:0回答:1

我必须找到从1到20亿进行二进制搜索所需的时间,但我无法使用数据类型。 long int或long long int或任何其他显示分段错误。最高999999可以正常工作,但9999991会给出分段错误。请帮助。

 void binSch2(long  int arr[], long int x, long int l, long int h)
 {

    if(l>h)
    {
        printf("not present");
        return;
    } 
    unsigned long  int mid=l+(h-l)/2;
    if(arr[mid]==x)
    {
        printf("found %ld at %ld", x, mid);
    }
    else if(x<arr[mid]) binSch2(arr, x, l, mid-1);
    else if(x>arr[mid]) binSch2(arr,x , mid+1, h);

 }

int main()
{

    long  int limit=2000000000;
    long  int arr2[limit];
    for(long  int i=0; i<limit; i++)
    {
        arr2[i]=i+1;
    }
    long  int N2=sizeof(arr2)/sizeof(arr2[0]);
    long  int x2=88888;
    long  int z=0;

    clock_t begin = clock();
    binSch2(arr2, x2, z, N2-1);
    clock_t end = clock();
    double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
    printf("\ntime : %lf ", (double)(end - begin) / CLOCKS_PER_SEC);

    return 0;
}
c++ c segmentation-fault long-integer binary-search
1个回答
0
投票

尝试如下在堆中为arr2变量分配内存-参见this

long int *arr2 = new long int[limit];

可能为每个函数分配了有限的堆栈大小(4k或4M(大)页面大小),并且局部变量进入了堆栈。因此,如果您进行计算,则堆栈上没有足够的空间用于arr2,一旦程序达到堆栈限制,程序返回访问冲突就会发生。另外,不要忘记释放分配的空间。delete [] arr2;

© www.soinside.com 2019 - 2024. All rights reserved.