Warm tip: This article is reproduced from serverfault.com, please click

c-确实将缓冲区强制转换为uint32_t会导致未对齐的访问

(c - does casting a buffer to a uint32_t cause unaligned access)

发布于 2020-11-29 07:52:27

如果我有一个通过网络进行序列化然后又作为char缓冲区接收的结构,我可以安全地将该缓冲区的一部分强制转换为,uint32_t还是由于序列化过程中删除了填充而导致未对齐的内存访问吗?IE

typedef struct foo{
    uint8_t y;
    uin32_t x;
} foo;

void sendFoo(foo *f) {
    //create a buffer to use
    //...
    buffer[0] = f->y;
    uint32_t x = htonl(foo->x);
    memcpy(buffer+1, (char*)&x, sizeof(uint32_t));
    //...
}

foo recvFoo() {
    //create some foo and a buffer for recv to work with
    //...
    f.y = buffer[0];
    f.x = ntohl(*(uint32_t*)(buffer+1)); //potential unaligned access error?
    //...
}

如果这确实导致错误,那么我应该如何反序列化此结构?

Questioner
zee
Viewed
11
ikegami 2020-11-29 16:33:00

提供的信息不能保证buffer+1正确对齐以进行32位读/写。在x86 / x64上这不是问题(可能出于性能原因除外),但是在其他平台上也可能如此。

就像你通过memcpy在发送方上使用避免了该问题一样memcpy如果你希望可移植性,则可以在接收方上使用来回避该问题

(我假设buffer是一个char*。)