![](/img/trans.png)
[英]How to use fscanf() for two strings (of ANY length) and dynamically allocate/de-allocate the memory properly
[英]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);
這是未定義的行為。 不確定您要在這里完成什么,因為您的取消分配不會更改nrOfPerson
或ptrSkicard
。 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.