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; }`
Пытался добавить в функции проверки на успешное выделение памяти, но не помогло.