0xC0000005: нарушение прав доступа при чтении по адресу 0x00000000FDFDFDFD // Сортировка строчного массив с указателями в итератор

Задача: "Преобразовать функцию сортировки с использованием массивов (b), списков (6.3), деревьев (8.4, 8.5) в итератор. Проверить его работу на двух структурах данных содержащих указатели на различные типы (например, целые и строки). Массив преобразовать в массив указателей."

В консоли пишу предпоследнюю строчку строчного массива заданного размера и возникает ошибка.

Строчки, где возникают данная ошибка:

int arr_cmp_str(void* first, void* second) { // функция для сравнения строк

return strcmp(*(char**)first, *(char**)second); // Здесь компилятор ругается на доступ к чтению памяти }


// Вызвано исключение по адресу 0x00007FFE0F0D5E08 (ucrtbased.dll) в test.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000000FDFDFDFD. //

{ void sort_str(void* struc, void* begin(void*), void* end(void*), void* next(void*), int (cmp_str)(void*, void*),
void (*swap_str)(void*, void*), void* prev(void*)) // итератор для строчных

void* i = begin(struc);
void* last = end(struc);
i = next(i);
for (; ; i = next(i)) {
    for (void* j = i; cmp_str(j, prev(j)) < 0; j = prev(j)) // та же ошибка с выделением памяти, только на эту строчку ругается в VS 2019
    {
        swap_str(j, prev(j));
        if (j == next(begin(struc))) break;
    }
    if (i == last) break;
}

И теперь виновник сего торжества по мою мнению: ` char** input_arr_str(int size) { char** arr = (char**)malloc(size * sizeof(char*)); // Выделение памяти для размера массива указателей

if (arr == NULL) { // Проверка успешности выделения памяти
    printf("Ошибка выделения памяти для массива указателей.\n");
    return NULL;
}


printf("\nВведите строки:\n");
for (int i = 0; i < size; i++) {
    arr[i] = (char*)malloc(256 * sizeof(char)); // выделение памяти для каждой строки в условном размере 256 байт
    if (arr[i] == NULL) { // Проверка успешности выделения памяти
        for (int j = 0; j < i; j++) {
            free(arr[j]); // Освобождение памяти при ошибке
        }
        free(arr); // Освобождение массива указателей
        printf("Ошибка выделения памяти для строки %d.\n", i);
        return NULL;
    }
    fgets(arr[i], 256, stdin); // Чтение строки

    arr[i][strcspn(arr[i], "\n")] = 0; // Удаление символа новой строки
}
return arr; }`

Пытался добавить в функции проверки на успешное выделение памяти, но не помогло.


Ответы (0 шт):