[英]freeing an allocation in a struct inside a struct
当我尝试释放结构内部的结构中的分配时,出现错误。 我该如何解决?
typedef struct card
{
char* sign;
char* color;
int number;
char* name;
}card;
typedef struct deck
{
card data;
deck* next;
}deck;
deck* deleteHead(deck* head)
{
deck* curr = head;
if (head==NULL)
return head;
curr=curr->next;
if(head->data.color!=NULL)
free(head->data.color);//error
if(head->data.name!=NULL)
free(head->data.name);//error
if(head->data.sign!=NULL)
free(head->data.sign);//error
free(head);//ok
return curr;
}
当我删除错误并仅释放头部时,它将起作用;但是,当我尝试删除头部中的分配时,会出现运行时错误。 我该如何解决? 先感谢您。
您可能没有初始化card
结构中的指针。 这些应该被初始化为NULL
或指向malloc
, calloc
或strdup
分配的malloc
的指针。
还要注意,在调用free()
之前不需要测试针对NULL
指针。 free(NULL);
将立即正常返回,使用NULL
进行free
调用是合法的。 顺便说一句,在C ++中delete
空指针也是合法的。
该功能可以通过以下方式进一步简化:
deck *deleteHead(deck *head) {
deck *next = NULL;
if (head != NULL) {
next = head->next;
free(head->data.color);
free(head->data.name);
free(head->data.sign);
free(head);
}
return next;
}
free函数只能取消分配先前由对malloc,calloc或realloc的调用分配的内存块。 如果正确初始化代码,则代码将运行而不会出现任何运行时错误。 这是一个示例代码:
int main()
{
deck* root = (deck*)malloc(sizeof(struct deck));
root->card.color = strdup("color");
root->card.name = strdup("name");
root->card.sign = strdup("sign");
root->card.number = 2;
root->next = NULL;
root = deleteHead(root);
return 0;
}
而且您的代码中有一些更正:
typedef struct deck
{
card data;
struct deck* next;
}deck;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.