2016-10-27 125 views
0

嗨,我一直在學校項目和需要你的代碼幫助。我使用的valgrind弄清什麼是錯的,需要擺脫可怕的錯誤是什麼exacly指你的想法哈希表valgrind內存泄漏

功能插入新的元素插入表

這是錯誤之一,我得到

在0x4C29B32處無效寫入大小爲1的 :通過0x401CE9得到的strcpy(vg_replace_strmem.c:458):HTab_insert(ial.c:65) by 0x4019B5:main(main.c:82)地址0x5449785在塊之後爲0字節大小5在0x4C28FA4處alloc'd :malloc(vg_replace_malloc.c:296) by 0x401CC9: HTab_insert(ial.c:64)由0x4019B5 :主(main.c中:82)

HTab_listitem* HTab_insert(HTab_t* ptrht, Ttoken token) { 
    unsigned ind = hash_function(ptrht->htable_size,token); 
    HTab_listitem* item_ptr = NULL; 
    HTab_listitem* item = ptrht->list[ind]; 
    HTab_listitem* nextitem; 

    if(item == NULL) { 
     nextitem = malloc(sizeof(HTab_listitem)+sizeof(char)*(strlen(token.data)+1)); 

     if(nextitem == NULL) 
      /*allocation error*/ 
      return NULL; 
     else { 
      //printf("HERE\n"); 
      //printf("%s\n", token.data); 
      //memcpy(nextitem->token.data,token.data,strlen(token.data)+1); 
      int length = strlen(token.data); 
      nextitem->token.data = malloc(length * sizeof((char) +2)); 
      strcpy(nextitem->token.data,token.data); 
      nextitem->token.data[length] = '\0'; 
      nextitem->token.stav = token.stav; 
      //printf("HERE AFTER\n"); 
      nextitem->ptrnext = NULL; 

      item = ptrht->list[ind] = nextitem; 

      nextitem = NULL; 
      if(item == NULL) 
       return NULL; 
     } 
    } 
    else { 
     while(item != NULL) { 
      if(strcmp(item->token.data,token.data) == 0) { 
       //if found 
       item_ptr = item; 
       break; 
      } 
      else { 
       //next item 
       item_ptr = item; 
       item = item->ptrnext; 
      } 
     } 
     if(item_ptr != NULL && item != item_ptr) { 
      //not found insert next item 
      nextitem = malloc(sizeof(HTab_listitem*)+sizeof(char)*(strlen(token.data)+1)); 
      if(nextitem == NULL) 
       /*allocation error*/ 
       return NULL; 
      else { 
       //memcpy(nextitem->token.data,token.data,strlen(token.data)+1); 
       int length = strlen(token.data); 
       nextitem->token.data = malloc(length * sizeof((char) +2)); 
       strcpy(nextitem->token.data,token.data); 
       nextitem->token.data[length] = '\0'; 
       nextitem->token.stav = token.stav; 

       nextitem->ptrnext = NULL; 
       item = nextitem; 
       if(item == NULL) 
        return NULL; 
       item_ptr->ptrnext = item; 
      } 
     } 
    } 
    return item; 
} 
+1

請顯示[mcve]。 –

+0

您使用'strcpy'來複制'token.data'。你確定'token.data'是空終止? – GMichael

+1

這是不正確的(+2不應該在括號內):'malloc(length * sizeof((char)+2))''。你的意思是'malloc(長度+2)'? (注意:'sizeof(char)'是'1',因此可以省略) –

回答

0

你有幾個分配錯誤,可能會導致不確定的行爲。 我將進入從上面的代碼底部

首先,你分配的內存

nextitem = malloc(sizeof(HTab_listitem)+sizeof(char)*(strlen(token.data)+1)); 

凡以下應該是足夠的,因爲nextitem-> token.data是繼分配。

nextitem = malloc(sizeof(HTab_listitem)); 

此外,分配token.data時,使用以下命令:

int length = strlen(token.data); 
nextitem->token.data = malloc(sizeof(char) * (length + 1)); 
nextitem->token.data[length] = 0; 

你的第二個項目分配又是不正確的大小。 您分配指針的sizeof(8字節)而不是結構的大小,並添加token.data仍然不是有用的。

nextitem = malloc(sizeof(HTab_listitem*)+sizeof(char)*(strlen(token.data)+1)); 
//Error here (HTab_listitem*) 

這應該是:

nextitem = malloc(sizeof(HTab_listitem)); 

話又說回來分配token.data爲previousely完成。