如何释放单链表中的内存

时间:2014-02-27 01:08:22

标签: c visual-studio linked-list

关于如何释放我在char *函数中为CreateList(在FreeList func中分配)分配的内存的任何建议?

基本上,我会将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);         
      }
 }

5 个答案:

答案 0 :(得分: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 * */         
    }
}

我认为你应该寻找。

答案 1 :(得分:0)

您可以使用与现有代码相同的原则:

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

答案 2 :(得分:0)

我认为这是值得尝试的(传递指针的地址,因为你将它传递给另一个函数):

调用函数:FreeList(& head)

调用函数:void FreeList(LIST ** head)

答案 3 :(得分: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 */
}

答案 4 :(得分: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中的常见字符串复制有助于防止像这样的愚蠢错误 - 一直发生