有没有更简单的书写方法:
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'd缓冲区?
注意:typedef发生在标头中:
#define OP_RVER 1
typedef struct rver_s {
uint32_t op;
uint32_t protocol_version;
} rver_t;
您可以键入:
buf -> op = OP_EVER;
buf -> protocol_version = 1;
这是一个老问题,但这里是给路过的人的答案。
功能重写
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()
的第一个参数没有被检查,分配错误将导致未定义的行为。在大多数具有内存保护的主机上,它会因分段故障而崩溃,这通常是可以接受的行为。