Перераспределение памяти, 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 и копируем в нее слово
- Закрываем файл
- Выводим содержимое массива на экран
- Освобождаем память, выделенную под каждую строку и под массив указателей на строки
- Завершаем программу