簡體   English   中英

在C中取消分配結構內部的結構內存

[英]De-allocate memory of structs inside a struct in C

我建立了一個包含多個結構的程序。 我們有一個稱為“預訂”的“基本”結構,它將包含在度假地點進行預訂所需的所有信息。 看起來像這樣:

typedef struct {
    char forename[NAME_LEN];
    char surname[NAME_LEN];
    char socialNr[SOCIAL_NR];
    int nrOfPerson;
    Person arrPerson[MAX_GUEST];
    int rentPeriod[2];
    int totalCost;
    Cabin *cabin;
    int seniorCard;
    int juniorCard;
    int childCard;

} Booking;

預訂還包含其他2個結構,其中一個可以容納最多8人的人員陣列,以及一個客艙結構。 這兩個都看起來像這樣:

typedef struct {
    char forename[NAME_LEN];
    char surname[NAME_LEN];
    char socialNr[SOCIAL_NR];
    Skicard *ptrSkicard;
    int age;

} Person;

 typedef struct {
    int nr;
    int cost;
    int booked[WEEKS];
    int typeOfCabin;

} Cabin;

該人員結構還擁有一個附加的滑雪卡結構,如下所示:

typedef struct {
    int price;

} Skicard;

我的問題是,當它們彼此在一起時,如何正確地重新分配它們的內存?

我已經開始了,我認為我必須從內部搬走,所以我嘗試先刪除所有的滑雪卡,然后再刪除人員,然后再刪除客艙,最后是預訂。

void removeBooking(Booking *booking)
{
    for (int i = 0; i < booking->nrOfPerson; i++)
    {
        free(booking->arrPerson[i].ptrSkicard);
    }
    free(booking);
    printf("%d", booking->nrOfPerson);
}

但是我被困在這里。 如何正確執行此操作?

編輯:忘記顯示分配是如何完成的。

    Booking *allBookings = (Booking *)malloc(sizeof(Booking) * 1);
    Cabin *ptrCabin = (Cabin *)malloc(sizeof(Cabin) * 1);
    Skicard *ptrSkicard = (Skicard *)malloc(sizeof(Skicard) * 1);

首先,請注意一些結構,即

Person arrPerson[MAX_GUEST];

Booking結構的組成部分,不應既不分配也不取消分配-那些將與Booking結構一起分配/取消分配。

但是我們僅保留指向的結構,即:

Skicard *ptrSkicard;

要么

Cabin *cabin;

應該分配和釋放。

基本上,您應該以與分配相反的順序取消分配。 例如,分配可以是:

malloc Booking
malloc Skicards in a loop
malloc Cabin

因此,釋放應該是相反的,即:

free Cabin
free Skicards in a loop
free Booking

你可以做:

void removeBooking(Booking *booking)
{   
    for (int i = 0; i < booking->nrOfPerson; i++)
    {   
        free(booking->arrPerson[i].ptrSkicard);
        booking->arrPerson[i].ptrSkicard = NULL;
    }
    free(booking->cabin);
    booking->cabin = NULL
    free(booking);
}

在調用removeBooking()函數之后,或者在替代方法中,可以在調用方函數中將booking指針設置為NULL ,或者,您可以傳遞預訂指針的地址並取消引用,同時釋放其他關聯的分配,並且在removeBooking()結束時設置*booking = NULL

您已釋放Booking所占用的內存(由booking指向),然后嘗試訪問它。

free(booking);
printf("%d", booking->nrOfPerson);

這是未定義的行為。 不確定您要在這里完成什么,因為您的取消分配不會更改nrOfPersonptrSkicard free()不會更改指針。

請注意,您的函數逐點傳遞值,因此您無法在其外部更改指針。 如果需要的話:

void removeBooking(Booking **booking)
{
    int i;
    for (i = 0; i < (*booking)->nrOfPerson; i++)
    {
        free((*booking)->arrPerson[i].ptrSkicard);
    }
    free((*booking)->cabin);
    free(*booking);
    *booking = NULL;
    printf("%d", i);
}
void removeBooking(Booking *booking)
{
   for (int i = 0; i < booking->nrOfPerson; i++)
   {
      free(booking->arrPerson[i].ptrSkicard);
   }
   memset(&booking,0,sizeof(booking));
   printf("%d", booking->nrOfPerson);
}

如果您要免費預訂(結構),則可以像上面一樣進行一次預訂。謝謝

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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