Прога встает намертво при выделении памяти - C (СИ)
Формулировка задачи:
Всем привет. В универе пишем лабу по сортировкам. Надо сгенерировать массив уникальных чисел.
Юзаем такую функцию:
Данный код отлично отрабатывается на 5-30к, 40к и больше - слово "test3" не выводится и не выполняется следующая функция, смотрел по диагностики памяти, видно, что выделяется.
void generate_rnd_array(int * destinationArray, int count) {
int number, i;
int * cache = (int*)calloc(count, sizeof(int));
printf("test");
srand(time(NULL));
printf("test2");
for (i = 0; i < count; i++) {
do
{
number = rand() % count;
}
while (cache[number] != 0);
cache[number] = 1;
destinationArray[i] = number;
}
printf("test3");
}Решение задачи: «Прога встает намертво при выделении памяти»
textual
Листинг программы
void generate_partially_ordered_array(int * destinationArray, int count) {
int number, i, j;
int * cache;
int currentIndex = 0;
srand(count);
cache = (int*)calloc(count, sizeof(int));
for (i = 0; i < (count / 100); i++) {
for (j = 0; j < 100; j++) {
do {
number = (i * 100) + rand() % 99;
} while (cache[number] == 1);
cache[number] = 1;
destinationArray[currentIndex++] = number;
}
memset(cache, 0, sizeof(int)*count);
}
}
Объяснение кода листинга программы
- Объявлены переменные:
number- для хранения числового значенияiиj- для работы в циклахcache- для временного хранения чиселcurrentIndex- для отслеживания индекса текущего элемента в массивеcount- количество элементов в массиве
- Инициализируется генератор случайных чисел
- Выделяется память под массив
cacheс помощью функцииcalloc, которая возвращает указатель на начало блока памяти. Размер блока памяти определяется переменнойcount, аsizeof(int)указывает на размер памяти, выделяемой под каждый элемент массива. - В главном цикле происходит заполнение массива
cacheчислами от 0 до 99. Цикл выполняется, пока текущий индекс не достигнет 100. - Каждое сгенерированное число проверяется на уникальность в массиве
cache. Если число уже присутствует в массиве, то оно заменяется новым числом. - После заполнения массива
cacheчислами, он передается в функциюmemset, которая обнуляет все его элементы. - После выполнения всех итераций главного цикла, текущий индекс увеличивается на единицу.
- В конце функции происходит выделение памяти под массив
cacheс помощью функцииfree.