簡體   English   中英

釋放結構內部的結構中的分配

[英]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或指向malloccallocstrdup分配的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM