使用realloc动态增长结构数组会导致堆损坏

时间:2018-06-25 14:01:12

标签: c pointers struct dynamic-memory-allocation

我正在尝试从txt文件读取结构化数据并将其存储到结构中。由于我不知道该文件将包含多少个条目,因此我必须动态增长一个结构数组。根据以下代码示例,我尝试使用 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 :(得分:0)

根据realloc的文档,如果失败,则返回NULL。结果,data = realloc(data,...)会在函数失败时导致指针损坏。这可能会导致在发布的代码中提出各种问题