关于如何释放我在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);
}
}
答案 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中的常见字符串复制有助于防止像这样的愚蠢错误 - 一直发生 。