[英]Initialize an empty nested struct using a function
我必須通過實現最后聲明的 init_coworking 函數來初始化 tCoworking coworking。
/* Constants *********************************************************/
#define nWorkSpaces 50
#define unlimited 2000
/* Types *************************************************************/
typedef enum {tableFlex, tableFix, officeFix} rate;
typedef char string[55];
typedef struct {
int reservationId;
float monthPayment;
} tContractAnnex;
typedef struct {
int id;
string name;
int discount;
} tPartner;
typedef struct {
int id;
float surface;
rate rateType;
} tWorkspace;
typedef struct {
int partnerId;
int month;
int year;
tContractAnnex annex;
} tContract;
typedef struct {
tWorkspace workSpace[nWorkSpaces];
tContract contract[unlimited];
tPartner partner[unlimited];
} tCoworking;
/* Function declaration */
void init_coworking(tCoworking *coworking);
正如您所看到的,我遇到的問題是 tCoworking 是一個嵌套結構,其數據類型為 stucts 數組。到目前為止,我這樣做是為了初始化它,但它必須是一種更好的方法。
void init_coworking(tCoworking *coworking){
coworking = malloc(sizeof(tCoworking));
coworking->partner[0].id = 0;
coworking->partner[0].discount = 0;
strcpy(coworking->partner[0].name, "");
coworking->workSpace[0].id = 0;
coworking->workSpace[0].rateType = 0;
coworking->workSpace[0].surface = 0;
coworking->contract[0].partnerId = 0;
coworking->contract[0].year = 0;
coworking->contract[0].month = 0;
coworking->contract[0].annex.monthPayment = 0;
coworking->contract[0].annex.reservationId = 0;
}
最簡單的方法是使用calloc
。 與malloc
一樣,它為您分配內存,但也將所有內存設置為零。
但是 -更重要的是您當前的功能沒有意義。 您分配的內存只是丟失了。 init_coworking
的調用者永遠不會得到分配和初始化的內存。
要么你應該:
malloc
(或calloc
)或者
malloc
ed 指針。 由於原型建議您獲得一個tCoworking
指針,因此最有可能的是它已經分配(以某種方式),即您想要選項 1。
所以只需這樣做:
void init_coworking(tCoworking *coworking){ // NO malloc
memset(coworking, 0, sizeof(tCoworking));
}
如果您只想將第一個數組成員設置為零(如您的代碼所示),您可能會通過以下方式獲得一些性能改進:
void init_coworking(tCoworking *coworking){ // NO malloc
memset(&coworking->partner[0], 0, sizeof(coworking->partner[0]));
... similar for the other arrays ...
}
但我懷疑這是否值得麻煩...
void init_coworking(tCoworking *coworking) {
coworking && memset( coworking, 0, sizeof( tCoworking ) );
}
memset
將一塊內存 - 指定長度 - 初始化為單個字節值。 您的示例表明您希望對整個對象進行零初始化,因此memset
可以很好地滿足此目的。
NULL
您的輸入參數。
我建議您不要在函數中使用malloc
或calloc
,因為您的函數簽名暗示調用者是tCoworking
的所有者。 如果您在init_coworking()
函數中進行malloc
,那么您將創建一個新的堆分配的tCoworking
實例, tCoworking
沒有明確的所有權。 您可以嘗試在某種類型的容器中跟蹤新分配的對象,但這遠遠超出了您的問題范圍 - 保持簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.