簡體   English   中英

使用函數初始化一個空的嵌套結構

[英]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的調用者永遠不會得到分配和初始化的內存。

要么你應該:

  1. 不做任何malloc (或calloc

或者

  1. 返回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您的輸入參數。

我建議您不要在函數中使用malloccalloc ,因為您的函數簽名暗示調用者是tCoworking的所有者。 如果您在init_coworking()函數中進行malloc ,那么您將創建一個新的堆分配的tCoworking實例, tCoworking沒有明確的所有權。 您可以嘗試在某種類型的容器中跟蹤新分配的對象,但這遠遠超出了您的問題范圍 - 保持簡單。

暫無
暫無

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

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