Перераспределение памяти, realloc - C (СИ)
Формулировка задачи:
Есть код, который считывает из файла слова и записывает их в динамическую записную книжку. Всё работает сначала нормально. Ошибка возникает при перераспределение памяти. Раннее считанные строки не перераспределяются, а теряются. Вот вопросы:
1)Как перераспределить память для двойного указателя?
2)Как исправить мой код?
#include <stdio.h> #include <stdlib.h> #include <string.h> #define INITIAL_SIZE_BOOK 5 #define SIZE_BUF 1024 #define ERR_OPEN_FILE 1 #define ERR_MEMORY 2 int main(int argc, char *argv[]) { char **book; long flag, id, max_id = INITIAL_SIZE_BOOK - 1; char buf[SIZE_BUF], pathToFile[SIZE_BUF]; FILE *fp; int i; printf("enter path to file: "); scanf("%s", pathToFile); if( !(fp = fopen(pathToFile, "rt"))) exit(ERR_OPEN_FILE); book = (char **)calloc(INITIAL_SIZE_BOOK, sizeof(char *)); if(!book) exit(ERR_MEMORY); id = 0; flag = fscanf(fp, "%s", buf); while(!feof(fp) && flag > 0) { book[id] = (char *)malloc(strlen(buf) * sizeof(char)); strcpy(book[id], buf); id++; if(id == max_id){ max_id *= 2; book = (char **)realloc(book, max_id); } flag = fscanf(fp, "%s", buf); } fclose(fp); return 0; }
Решение задачи: «Перераспределение памяти, realloc»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #define INITIAL_SIZE_BOOK 5 #define SIZE_BUF 1024 #define ERR_OPEN_FILE 1 #define ERR_MEMORY 2 int main(void) { char **book; long i, id, max_id = INITIAL_SIZE_BOOK; char buf[SIZE_BUF]; FILE *fp; printf("enter path to file: "); scanf("%s", buf); if( !(fp = fopen(buf, "rt"))) exit(ERR_OPEN_FILE); //выделяем память для блокнота book = (char **)calloc(INITIAL_SIZE_BOOK, sizeof(char *)); if(!book) exit(ERR_MEMORY); //записываем слова в блокнот из файла id = 0; while(fscanf(fp, "%s", buf) == 1) { if(id == max_id){ max_id += max_id; book = (char **)realloc(book, max_id * sizeof(char *)); if(!book) exit(ERR_MEMORY); } book[id] = (char *)malloc((strlen(buf) + 1) * sizeof(char)); strcpy(book[id], buf); id++; } fclose(fp); puts("book:"); for(i = 0; i < id; i++) printf(" %s\n", book[i]); for(i = 0; i < id; i++) free(book[i]); free(book); return 0; }
Объяснение кода листинга программы
- Включаем необходимые заголовочные файлы
- Определяем начальный размер массива и размер буфера
- Определяем коды ошибок
- Создаем пустой массив для хранения слов
- Открываем файл для чтения
- Выделяем память для массива указателей на строки
- Читаем слова из файла и записываем их в массив
- Если размер массива достигнут, увеличиваем его с помощью realloc
- Выделяем память для каждой строки с помощью malloc и копируем в нее слово
- Закрываем файл
- Выводим содержимое массива на экран
- Освобождаем память, выделенную под каждую строку и под массив указателей на строки
- Завершаем программу
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д