0

もっと簡単に書く方法はありますか:

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;
4

2 に答える 2

2

次のように入力できます。

buf -> op = OP_EVER;
buf -> protocol_version = 1;
于 2013-02-07T11:29:26.393 に答える
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()などと同様)。もちろん、NULLas first パラメータがmemcpy()チェックされていないため、割り当てエラーが未定義の動作につながることに注意する必要があります。メモリ保護を備えたほとんどのホストでは、セグメンテーション違反でクラッシュしますが、これは多くの場合許容される動作です。

于 2016-08-04T10:12:15.667 に答える