2013-02-07 63 views
0

是否有寫的更簡單的方法:使用文字來初始化malloc分配緩衝化合物

rver_t *buf = malloc(sizeof(rver_t)); 
rver_t tmp = (rver_t) {.op=OP_RVER, .protocol_version=1}; 
memcpy(buf, tmp, sizeof(rver_t)); 

初始化與結構一個malloc分配緩衝區?

注:的typedef發生在頭:

#define OP_RVER 1 
typedef struct rver_s { 
    uint32_t op; 
    uint32_t protocol_version; 
} rver_t; 
+5

我期望'* buf =(rver_t){...};'也可以。 –

+0

什麼是整點?你的代碼中的複合文字提供_no_其他目的,但混淆。您正在嘗試解決這些問題無需解決的問題。只需將值直接分配給buf的成員即可。那麼代碼在可讀性和性能方面都是最優的。 – Lundin

+0

@Lundin:只分配已知成員將不會zero-init未知的成員。複合文字或命名的臨時變量是唯一的**方法來做到這一點。 ('calloc'無效,因爲它不是表示值而是零) –

回答

2

您可以鍵入:

buf -> op = OP_EVER; 
buf -> protocol_version = 1; 
0

老問題,但在這裏,對於普通路人的回答。

功能重寫

rver_t *buf = memcpy(malloc(sizeof(rver_t)), &(rver_t) {.op=OP_RVER, .protocol_version=1}, sizeof(rver_t)); 

或寫隱藏組合

#define RVERALOC(a, b) memcpy(malloc(sizeof(rver_t)), &(rver_t){.op=(a), .protocol_version=(b)}, sizeof(rver_t)); 

rver_t *buf = RVERALOC(OP_RVER, 1); 

的想法是要記住,這一事實memcpy()返回其第一參數(一樣memmove()strcpy()等宏)。 當然,必須注意分配錯誤會導致未定義的行爲,因爲memcpy()的第一個參數NULL未被檢查。在大多數具有內存保護功能的主機上,會出現分段故障,這通常是可以接受的行爲。