使用复合文字来初始化malloc'd缓冲区,

时间:2013-02-07 11:25:17

标签: c struct initialization 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));

使用struct?

初始化malloc'd缓冲区

注意:typedef发生在标题中:

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

2 个答案:

答案 0 :(得分:2)

您可以输入:

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

答案 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()等)。 当然,必须注意分配错误会导致未定义的行为,因为NULL作为memcpy()的第一个参数未被检查。在大多数具有内存保护的主机上,它会因分段错误而崩溃,这通常是可接受的行为。