c语言 - 使用复合文字初始化 malloc'd 缓冲区,



有没有更简单的书写方法:

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()的第一个参数没有被检查,分配错误将导致未定义的行为。在大多数具有内存保护的主机上,它会因分段故障而崩溃,这通常是可以接受的行为。

相关内容

  • 没有找到相关文章

最新更新