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 第一个参数。memcpy()在大多数具有内存保护的主机上,它会因分段错误而崩溃,这通常是可接受的行为。

于 2016-08-04T10:12:15.667 回答