Перераспределение памяти, 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;
}

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

  1. Включаем необходимые заголовочные файлы
  2. Определяем начальный размер массива и размер буфера
  3. Определяем коды ошибок
  4. Создаем пустой массив для хранения слов
  5. Открываем файл для чтения
  6. Выделяем память для массива указателей на строки
  7. Читаем слова из файла и записываем их в массив
  8. Если размер массива достигнут, увеличиваем его с помощью realloc
  9. Выделяем память для каждой строки с помощью malloc и копируем в нее слово
  10. Закрываем файл
  11. Выводим содержимое массива на экран
  12. Освобождаем память, выделенную под каждую строку и под массив указателей на строки
  13. Завершаем программу

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


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

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

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