具有堆分配的大型数组的分段错误
Segmentation fault on large size array with heap allocation
即使在我将 space 动态分配给包含 1000 万个条目的数组之后,在 4Gb 机器上 运行 时,以下代码也会给我一个分段错误。它适用于 100 万个条目,即 n = 1000000。以下代码使用基数排序对整数值及其索引值进行排序。我应该怎么做才能使该程序适用于 1000 万个条目。?
int main()
{
int n=10000000; // 10 million entries
int *arr=new int [n]; // declare heap memory for array
int *arri=new int [n]; // declare heap memory for array index
for(int i=0;i<n;i++) // initialize array with random number from 0-100
{
arr[i]=((rand()%100)+0);
}
for(i=0;i<n;i++) // initialize index position for array
{
arri[i]=i;
}
radixsort(arr, n ,arri);
return 0;
}
// The main function to that sorts arr[] of size n using Radix Sort
void radixsort(int *arr, int n,int *arri)
{ int m=99; //getMax(arr,n,arri);
// Find the maximum number to know number of digits
// Do counting sort for every digit. Note that instead
// of passing digit number, exp is passed. exp is 10^i
// where i is current digit number
for (int exp = 1; m/exp > 0; exp *= 10)
countSort(arr, n, exp,arri);
}
void countSort(int *arr, int n, int exp,int *arri)
{
int output[n],output1[n]; // output array
int i, count[10] = {0};
// Store count of occurrences in count[]
for (i = 0; i < n; i++)
{
count[ (arr[i]/exp)%10 ]++;
}
// Change count[i] so that count[i] now contains actual
// position of this digit in output[]
for (i = 1; i < 10; i++)
count[i] += count[i - 1];
// Build the output array
for (i = n - 1; i >= 0; i--)
{
output[count[ (arr[i]/exp)%10 ] - 1] = arr[i];
output1[count[ (arr[i]/exp)%10 ] - 1] = arri[i];
count[ (arr[i]/exp)%10 ]--;
}
// Copy the output array to arr[], so that arr[] now
// contains sorted numbers according to current digit
for (i = 0; i < n; i++)
{
arr[i] = output[i];
arri[i]=output1[i];
}
}
问题出在countSort
。 output
和 output1
数组是局部数组,不是动态分配的,它们对于局部变量来说太大了。您还使用了可变长度数组的 C 特性,它不是标准 C++ 的一部分。将它们更改为:
int *output = new int[n];
int *output1 = new int[n];
并添加
delete[] output;
delete[] output1;
函数结束时。
即使在我将 space 动态分配给包含 1000 万个条目的数组之后,在 4Gb 机器上 运行 时,以下代码也会给我一个分段错误。它适用于 100 万个条目,即 n = 1000000。以下代码使用基数排序对整数值及其索引值进行排序。我应该怎么做才能使该程序适用于 1000 万个条目。?
int main()
{
int n=10000000; // 10 million entries
int *arr=new int [n]; // declare heap memory for array
int *arri=new int [n]; // declare heap memory for array index
for(int i=0;i<n;i++) // initialize array with random number from 0-100
{
arr[i]=((rand()%100)+0);
}
for(i=0;i<n;i++) // initialize index position for array
{
arri[i]=i;
}
radixsort(arr, n ,arri);
return 0;
}
// The main function to that sorts arr[] of size n using Radix Sort
void radixsort(int *arr, int n,int *arri)
{ int m=99; //getMax(arr,n,arri);
// Find the maximum number to know number of digits
// Do counting sort for every digit. Note that instead
// of passing digit number, exp is passed. exp is 10^i
// where i is current digit number
for (int exp = 1; m/exp > 0; exp *= 10)
countSort(arr, n, exp,arri);
}
void countSort(int *arr, int n, int exp,int *arri)
{
int output[n],output1[n]; // output array
int i, count[10] = {0};
// Store count of occurrences in count[]
for (i = 0; i < n; i++)
{
count[ (arr[i]/exp)%10 ]++;
}
// Change count[i] so that count[i] now contains actual
// position of this digit in output[]
for (i = 1; i < 10; i++)
count[i] += count[i - 1];
// Build the output array
for (i = n - 1; i >= 0; i--)
{
output[count[ (arr[i]/exp)%10 ] - 1] = arr[i];
output1[count[ (arr[i]/exp)%10 ] - 1] = arri[i];
count[ (arr[i]/exp)%10 ]--;
}
// Copy the output array to arr[], so that arr[] now
// contains sorted numbers according to current digit
for (i = 0; i < n; i++)
{
arr[i] = output[i];
arri[i]=output1[i];
}
}
问题出在countSort
。 output
和 output1
数组是局部数组,不是动态分配的,它们对于局部变量来说太大了。您还使用了可变长度数组的 C 特性,它不是标准 C++ 的一部分。将它们更改为:
int *output = new int[n];
int *output1 = new int[n];
并添加
delete[] output;
delete[] output1;
函数结束时。