Прога встает намертво при выделении памяти - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Всем привет. В универе пишем лабу по сортировкам. Надо сгенерировать массив уникальных чисел. Юзаем такую функцию:
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");
}
Данный код отлично отрабатывается на 5-30к, 40к и больше - слово "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);
    }
}

Объяснение кода листинга программы

  1. Объявлены переменные:
    • number - для хранения числового значения
    • i и j - для работы в циклах
    • cache - для временного хранения чисел
    • currentIndex - для отслеживания индекса текущего элемента в массиве
    • count - количество элементов в массиве
  2. Инициализируется генератор случайных чисел
  3. Выделяется память под массив cache с помощью функции calloc, которая возвращает указатель на начало блока памяти. Размер блока памяти определяется переменной count, а sizeof(int) указывает на размер памяти, выделяемой под каждый элемент массива.
  4. В главном цикле происходит заполнение массива cache числами от 0 до 99. Цикл выполняется, пока текущий индекс не достигнет 100.
  5. Каждое сгенерированное число проверяется на уникальность в массиве cache. Если число уже присутствует в массиве, то оно заменяется новым числом.
  6. После заполнения массива cache числами, он передается в функцию memset, которая обнуляет все его элементы.
  7. После выполнения всех итераций главного цикла, текущий индекс увеличивается на единицу.
  8. В конце функции происходит выделение памяти под массив cache с помощью функции free.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.7 из 5
Похожие ответы