2014-02-27 33 views
0

如何在FreeList函數中釋放我爲char *(分配在CreateList函數中)分配的內存?如何在單鏈表中釋放內存

基本上,我將在CreateList返回根到的FreeList功能作爲函數參數。

我試圖用

temp = head; 
head = head->next; 
free(temp->str);   
free(temp);  

,但失敗了。

LIST *CreateList(FILE *fp) 
{ 
    /* Variable declaration */ 
    char input[BUFF]; 
    LIST *root = NULL; 
    size_t strSize;  
    LIST *newList;    

    /* Read till end of file */ 
    while (fscanf(fp, "%255s", input) != EOF) 
    { 
     strSize = strlen(input) + 1; 

     /* Function to determine if we shud create a new node or increment node count */ 
     if (!ListSame(root, input)) 
     { 
      /* New node */ 
      if ((newList = (LIST *)malloc(sizeof(LIST))) == NULL) 
      { 
       printf("Out of memory..."); 
       exit(EXIT_FAILURE); 
      } 
      if ((newList->str = (char *)malloc(sizeof(strSize))) == NULL) 
      { 
       printf("Not enough memory for %s", input); 
       exit(EXIT_FAILURE); 
      } 
      memcpy(newList->str, input, strSize); 
      newList->count = 1; 
      //determine if it is root 
      if (root == NULL) 
      { 
       newList->next = NULL; 
       root = newList; 
       } 
       else 
       { 
        newList->next = root->next; 
        root->next = newList; 
       } 
      } 
     } 
    return root; 
} 


    void FreeList(LIST *head) 
    { 
     LIST *temp = NULL; 
     char* str; 
     /* loop from root till end */ 
     while (head != NULL) 
     { 
      temp = head; 
      str = temp->str; 
      head = head->next; 
      free(str); 
      free(temp);   
     } 
} 
+0

編輯後,以新的變化。但不能修復它=/ – Vinc

回答

0
void FreeList(LIST *head) 
{ 
    LIST *temp = NULL; 
    /* loop from root till end */ 
    while (head != NULL) 
    { 
     temp = head; 
     head = head->next;  
     free(temp->str); /* Free the string does not matter if str is null */ 
     free(temp); 
     /* How do i free the dynamic allocated memory for char * */   
    } 
} 

我想你應該尋找。

0

您可以使用相同的原則,現有的代碼:

char* str = head->str; 
if(str != NULL) 
{ 
    free(str); 
} 
+0

你不需要if語句。 '免費(NULL)'是一個noop! –

+0

Yeap。之前嘗試過,但在第二次迭代中,它失敗了。 – Vinc

0

我認爲這將是值得嘗試(傳遞指針的,因爲你是它傳遞給另一個函數的地址):

調用函數:的FreeList(&頭)

調用的函數:無效的FreeList(LIST **頭)

0

你的列表是遞歸定義類型...爲什麼不使用遞歸?

void FreeList(LIST *node) 
{ 
    if (node == null) /* end of the line */ 
     return; 
    LIST *next = node->next; /* save a copy of the next to be freed */ 
    /* free the contents of the current node */ 
    free(node->str); 
    free(node); 
    FreeList(next); /* free the next */ 
} 
0

你是不是正確的爲您的字符串分配內存:

if ((newList->str = (char *)malloc(sizeof(strSize))) == NULL) 

分配用於size_t型足夠的內存 - 不需要字符串的字符數。

它應該是:

if ((newList->str = (char *)malloc(strSize)) == NULL) 

實際上,更妙的是:

if ((newList->str = strdup(input)) == NULL) 

那麼你也可以擺脫的代碼,做了memcpy()行。

使用strdup()處理常見的字符串複製在C有助於防止愚蠢的錯誤這樣的 - 這發生所有的時間

+0

啊。這工作! 非常感謝。沒有意識到這個問題實際上在CreateList,我猜測我太過集中在FreeList函數上。 = / – Vinc