2016-08-18 10 views
1

Следующий код дает мне ошибку сегментации при запуске на машине 4Gb даже после того, как я динамически выделяю пространство массиву, содержащему 10 миллионов записей. Он отлично работает с 1 миллионом записей, т. Е. N = 1000000. Следующий код сортирует целочисленные значения вместе с их значением индекса, используя сортировку radix. Что я должен сделать, чтобы эта программа работала на 10 миллионов записей?Ошибка сегментации массива большого размера с распределением кучи

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]; 
     } 

} 
+0

Массивы в 'countSort' не выделяются динамически. – Barmar

+0

Обратите внимание, что массивы переменной длины не являются стандартными C++. Они находятся на C, и ваш компилятор разрешает им расширение. – Barmar

ответ

2

Проблема в countSort. Массивы output и output1 являются локальными массивами, а не динамически распределены, и они слишком велики для локальных переменных. Вы также используете функцию C массивов переменной длины, которые не являются частью стандартного C++. Изменение их:

int *output = new int[n]; 
int *output1 = new int[n]; 

и добавить

delete[] output; 
delete[] output1; 

в конце функции.

+0

Лучше использовать 'std :: vector' вместо этого. Пусть он управляет памятью для вас. –

+0

Или, может быть, в зависимости от платформы и инструментальной цепочки установите соответствующие флажки компоновщика, чтобы зарезервировать достаточное количество столовой для размещения локальных массивов. – dxiv

+0

@RemyLebeau Я не хотел перепроектировать программу, просто покажу простое исправление своей ошибки. Он думал, что не использует локальные массивы, он пропустил это место. – Barmar

Смежные вопросы