下面是我试图运行的代码,我不断收到错误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;
}
答案 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;
另外,检查您的比较结构是否是严格的比较器。
希望有所帮助