执行C ++程序时出现Segmentation fault(Core dumped)错误

时间:2016-01-21 15:59:23

标签: c++

下面是我试图运行的代码,我不断收到错误Segmentation fault。 添加比较。在下面的程序中,我需要考虑一个5000000或更少(这是n)数字的数组,并对这些数字实现快速排序。

int compare (const void * a, const void * b)
{
  const double *da = (const double *) a;
  const double *db = (const double *) b;

  return (*da > *db) - (*da < *db);
  }
int main(){

int n = rand()% 5000000;
double arr[n];
for (int i=0; i<n; i++)
{
    arr[i] = (double)rand();
}
qsort(arr,n, sizeof(double), compare);
 for (int  i=0;i<n;i++){
     cout<<arr[i]<<"\n";
 }
     return 0;
 }

3 个答案:

答案 0 :(得分:2)

1)rand通常无法生成那么大的数字。它总共上限约32k

2)如果n不是编译时常量,则double arr[n];不合法。您可能正在使用不可移植的编译器扩展。

3)堆栈空间(arr所在的位置)通常非常有限。我怀疑它可以容纳如此多的数据,这是导致崩溃的原因。

答案 1 :(得分:1)

问题在于使用double arr[n]语法在堆栈上分配数组。

现在,堆栈是一种有限的资源,n可以增长到近5兆字节,这超出了normal size of the stack

您应该使用

在堆上分配数组
double * arr = new double[n];

然后使用

在函数末尾释放它
delete[] arr;

答案 2 :(得分:0)

对不起,这是一个非常局部的答案,但我无法添加评论(声誉低......) 仍然,应该在stdlib中定义一个RAND_MAX值(在我的情况下为0x7FFF) 所以我的理解是rand()返回0到32767之间的值。 如果您想要0到5000000之间的值,可以尝试

unsigned int n = ((double)rand()/RAND_MAX) * 5000000;
double * arr = new double[n];
...
delete[] arr;

另外,检查您的比较结构是否是严格的比较器。

希望有所帮助