2016-01-21 85 views
-1

下面是我尝试运行的代码,我不断收到错误分段错误。 增加了比较。在下面的程序中,我需要考虑一个5000000或更少(这是n)数字的数组,并在这些数字上实现快速排序。执行C++程序时出现分段错误(核心转储)错误

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

'n'的值是什么? –

+2

可能太大了...... –

+0

你能告诉我们'compare'的代码吗? – miniBill

回答

1

问题是,使用double arr[n]语法将数组分配到堆栈。现在

,堆栈是一种有限的资源,n能长到近5兆,这是远远超出了normal size of the stack

你应该

double * arr = new double[n]; 

,并在堆上分配数组然后在功能结束时释放它

delete[] arr; 
+4

delete [] arr我猜是更好 – sestus

+0

如何修改以修复错误?我不得不考虑一个数组,并且数组的长度可以达到5000000 – KSK

+0

@KSK使用堆,而不是堆栈 – johnbakers

2

1)rand通常不能生成大的数字。如果n不是编译时常量,则它是不合法的。32k

2)double arr[n];不合法。您可能正在使用不可移植的编译器扩展。

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

+0

有什么办法解决它?我必须考虑一个数组,并且数组的长度可以达到5000000 – KSK

+0

@KSK(1)[使用C++ 11'random'库生成您的数字](http://en.cppreference.com/w/ CPP /数字/随机的)。 (2)和(3):在堆空间中动态分配数组。 –

+0

1)真正依赖于系统,windows使用INT16_MAX标准gnu头使用INT32_MAX –

0

对不起,这是一个很偏的答案,但我不能那么我的理解兰特添加注释(低信誉...) 不过,应该有STDLIB定义(0x7FFF的在我的情况)一个RAND_MAX值 ( )如果你想在0和500万之间的值返回0到32767 之间的值,你可以尝试

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

此外,检查你的比较结构是有严格的比较器。

希望它有帮助

相关问题