Генерация массива размером 10 ^ 6 в C

#c

#c

Вопрос:

Я экспериментально тестирую методы сортировки (сортировка слиянием, быстрая сортировка и т. Д.) В «C» для сравнения времени. Для этой цели я произвольно генерирую массив больших размеров размером до 10 ^ 8, как показано в приведенном ниже коде. Но этот фрагмент кода работает для генерации размера до 10 ^ 5. При превышении этого предела компилятор перестает работать и отображает диалоговое окно «a.exe перестал работать».

Пожалуйста, помогите мне с этой проблемой. Спасибо

 int main(){
    srand(time(NULL));

    long long int sz;
    printf("Enter the size of array::");
   scanf("%lld",amp;sz);

   array_generate(sz);
}


long long int array_generate(long long int sz){
    
   
   long long int randArray[sz];
   long long int i;
   for(i=0;i<sz;i  )
     randArray[i]=rand()%1000; //Generate number between 0 to 1000
}
  
 

Комментарии:

1. Это должен быть массив переменной длины, который может быть размещен в стеке, который, по-видимому, недостаточно велик для этого в вашем случае. Попробуйте либо выделить malloc() , либо просто не использовать такие большие размеры массива и / или элемента.

Ответ №1:

Ваш код создает очень большие массивы в качестве локальных переменных. Локальные файлы обычно находятся в стеке, размер которого ограничен, поэтому, определяя такой большой локальный массив, вы переполняете стек, что приводит к сбою вашей программы.

Используйте malloc вместо этого для динамического выделения памяти в куче, которая намного больше.

 long long int *randArray = malloc(sz * sizeof *randArray);
 

Комментарии:

1. И используйте free(), когда закончите с этим!

Ответ №2:

Как указал @dbush, вы не можете динамически распределять такие большие массивы в стеке. Вместо этого вы должны использовать кучу.

В качестве общего совета я бы сказал, что никогда не пишите что-то подобное, если вы действительно не знаете, что делаете :

 int array[dynamic_size];
 

Вместо этого используйте массив фиксированного размера, например :

 #define FIXED_SIZE 200
[...]
int array[FIXED_SIZE];
// or int array[200];
 

Или используйте malloc (3) .

Что касается вашего кода, то обычно на C выполняется то, что вызывающий объект выделяет память и передает свой указатель на инициализирующую его функцию. Итак, ваш main будет выглядеть так :

 int main(){
    srand(time(NULL));

    long long int sz;
    printf("Enter the size of array::");
    scanf("%lld",amp;sz);

    // "sizeof *array" is the same as "sizeof(long long int)" but better because if you change the type of your array later, you won't have to change it twice (better from a maintainability POV)
    long long int *array = malloc(sz * sizeof *array); 

    array_generate(array, sz);
    array_process(array, sz);

    free(array);
    array = NULL; // not mandatory
}