2016-03-27 38 views
0

プロジェクトでこのエラーが発生しました。次のように関連するコードは次のとおり 次のように私はポインタ「値」にメモリを割り当てる:C言語エラーmunmap_chunk():無効なポインタアボート(コアダンプ)

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

次のようにそれを使用した後、私は値を解放:

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

そして私が会っエラーmunmap_chunk():無効なポインタアボート(コアダンプ)。 "値"の内容を次のように出力しようとすると、ポインタ "値"が有効になります。

正しい出力が得られます。 エラーはなぜ発生しますか? コードのフルバージョンは次のとおりです(長いコードを読んでいない場合はコメントにジャンプします) 主な機能では、私はReadCSV(ファイル、 &データ)を読み込み、すぐにResetData(&データ)を呼び出します。 私を助けてくれてありがとう!

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; 
} 
+0

データの種類は何ですか? – greenshade

+0

struct、typedef構造体です { \t char * tsname; \t TSItem * TSSet; \t int num_item; \t int num_class; \t int * ls_class; \t int length; } DATA; – pfc

+0

編集ポストとそこに貼り付けてください – greenshade

答えて

0

最初に私のページから飛び降りたのは、外側whileループの境界チェックの欠如です。私は最低でも... IDが大きすぎるなっていないことを確認します:

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

idは今まであなたが未定義の動作の領域の入力を開始大きくなりすぎた場合。

各領域のmalloc()には内部的な "ヘッダ"が関連付けられています。解放するメモリの空き容量は最低限必要です。あなたがこれを乗り越えれば、特にfree()呼び出しで、あらゆる種類の奇妙なことが起こる可能性があります。

+0

idが等しいMAXCまで上がると、あなたが見た動作を得ることができます。 – Gilbert