#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
}