C语言错误munmap_chunk():无效指针已中止(核心转储)

时间:2016-03-27 12:27:11

标签: c pointers

我在项目中遇到了这个错误。相关代码如下: 我为指针“values”分配内存,如下所示:

data->TSSet[0].values = (float *)malloc(sizeof(float)*10000);

然后在使用它之后,我按如下方式释放值:

free(data->TSSet[0].values);

然后我遇到了错误munmap_chunk():无效指针Aborted(core dumped)。指针“values”有效,因为当我尝试打印出“values”中的内容时,如下所示:

for(i=0;i<TSSet[0].length;i++)
    printf("%f\n",TSSet[0].values[i]);

我得到了正确的输出。 为什么会发生错误? 完整版代码如下:(我在关键部分添加注释,如果你不想阅读长代码,只需跳转到注释) 在main函数中,我只使用ReadCSV(文件和数据)读入数据,然后立即调用ResetData(&amp; data)。 谢谢大家的帮助!!!!

void ReadCSV(char *file_path, DATA *Data){
    Data->tsname = (char*)malloc(sizeof(char)*MAXNAME);
    Data->TSSet = (TSItem*)malloc(sizeof(TSItem)*MAXNITEM);
    FILE *fp = fopen(file_path, "r");
    if(fp == NULL)
        return ;
    char line[MAXSTRL];
    char *save_ptr,*tk;
    int id = 0, num_class = 0, i,label;
    Data->ls_class = (int *)malloc(sizeof(int)*MAXC);
    Data->num_item = 0;
    Data->length = 0;
    while(fgets(line, sizeof(line), fp)) {
        tk = strtok_r(line,",", &save_ptr);
        if (tk == NULL)
            return ;
        label = atoi(trim(tk));
        Data->TSSet[id].label = label;
        Data->TSSet[id].num_nbr = 0;
        if(IsExist(label,Data->ls_class, num_class) == 0){
            Data->ls_class[num_class] = label;
            num_class++;
        }
        // malloc the memory for values
        Data->TSSet[id].values = (float *)malloc(sizeof(float)*MAXL);
        Data->TSSet[id].knn = (Neighbor*)malloc(sizeof(Neighbor)*MAXK);
        i=0;
        // read in content of values from files
        while(tk!=NULL){
            tk = strtok_r(NULL,",", &save_ptr);
            Data->TSSet[id].values[i] = strtof(trim(tk),NULL);
            i++;
            if(strlen(save_ptr) == 0)
                break;
        }
        Data->TSSet[id].predlbl = -100;
        Data->TSSet[id].conf = 0.0;
        Data->TSSet[id].entropy = 0.0;
        Data->TSSet[id].length = i;
        id++;
    }
    if(fp == NULL)
        printf("NULL!!!!!!!!!!!!!!!!!!!!!\n");
    fclose(fp);
    Data->num_item = id;
    Data->length = i;
    Data->num_class = num_class;
}

void ResetData(DATA *data){
    int i;
    free(data->tsname);
    for(i=0;i<data->num_item;i++){
    // error here
        free(data->TSSet[i].values);
        free(data->TSSet[i].knn);
    }
    free(data->TSSet);
    data->num_item = 0;
    data->num_class = 0;
    free(data->ls_class);
    data->length = 0;
    return;
}

1 个答案:

答案 0 :(得分:0)

对我来说跳出页面的第一件事就是缺少对外部while循环的边界检查。我会验证 id 不会变得太大......至少:

 while(fgets(line, sizeof(line), fp)) { 
   assert( id < MAXC  );  /* (recommend a more "noisy" error message) */
   ...
 }

如果id太大,你就开始进入未定义行为的领域。

每个区域malloc()返回都有一个内部&#34;标题&#34;与之相关联,至少释放无内存的字节是释放。如果你走过去,可能会发生各种奇怪的事情,特别是在free()调用上。