是否有更简单的写作方式:
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;
答案 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()
的第一个参数未被检查。在大多数具有内存保护的主机上,它会因分段错误而崩溃,这通常是可接受的行为。