我注意到了一件非常奇怪的事情。 假设我定义了以下结构:
typedef struct
{
uint32_t a;
uint16_t b;
uint32_t c;
} foo;
这个结构体被包含在我从网络接收到的一个大缓冲区中。
以下代码在x86上可以正常工作,但在ARM上会收到SIGBUS
信号。
extern void * buffer;
foo my_foo;
my_foo = (( foo * ) buffer)[0];
使用memcpy代替指针解引用解决了这个问题。
在ARM上搜索关于SIGBUS的内容,指出这与内存对齐有关。
有人能解释一下发生了什么吗?
struct
注释为紧凑型,或者memcpy()
可能会工作(而不是SIGBUS
),但它不会正常运行。 - artless noisentohl()
,ntohs()
, protobufs, JSON, XSD, XDR,等等)。 - artless noise