Использование realloc для динамического увеличения массива структур приводит к повреждению кучи - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь прочитать структурированные данные из текстового файла и сохранить их в структуре.Поскольку я не знаю, сколько записей будет в этом файле, я должен динамически увеличивать массив структур.Я попытался сделать это с realloc , как показано в следующем примере кода:

#define BUFFER 200
#define ENTRY_MAX 10 // default number of entries

typedef struct data_storage {
    // store data in this struct
}data_storage;

int main() {
    FILE *fp;
    data_storage *data;

    char arr[10*BUFFER];
    char *token; // some data
    const char s[2] = ";"; // this is the data separator in txt file
    char *token_array[ENTRY_MAX];
    int i = 0; // iterator
    int number_of_entries = 1; // starts with at least one entry

    fp = fopen("sample_file.txt", "r");
    if(fp == NULL) {
        printf("Impossible to open file \n");
        return 1;
    }
    fgets(arr, 1000, fp); // gets a chunk of data from file

    token = strtok(arr, s);
    data = malloc(number_of_entries*sizeof(data_storage));

    while( token != NULL) {
        token = strtok(NULL, s);
        token_array[i] = token;
        i++;

        if(i >= ENTRY_MAX){
            /* 

                DO STUFF: uses strcpy to copy entries from token_array to data

            */
            number_of_entries++; // increments number of entries
            data = realloc(data, number_of_entries*sizeof(data_storage));
            i = 0; // proceeds to read next entry
        }
    }
    fclose(fp);

    return 0;
}

В основном я пытаюсь использовать strtok для чтения количества полей по умолчанию,и когда число токенов достигает ENTRY_MAX, я знаю, что прочитал всю запись и могу выделить память для еще одной структуры.

Но я получаю ошибку realloc(): invalid next size:, которая выглядит как повреждение кучи.

1 Ответ

0 голосов
/ 26 июня 2018

Согласно документации realloc, в случае неудачи возвращается NULL.В результате data = realloc(data,...) может вызвать повреждение указателя в случае сбоя функции.Это может привести к возникновению проблем в размещенном коде

...