gpt4 book ai didi

c - Linux 中的结构分配在 ARM 中失败但在 x86 中成功

转载 作者:IT王子 更新时间:2023-10-29 00:57:58 24 4
gpt4 key购买 nike

我注意到了一些非常奇怪的事情。假设我定义了以下结构

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 让我知道这与内存对齐方式有关。

谁能解释一下这是怎么回事?

最佳答案

您自己说过:您的特定处理器存在内存对齐限制,并且 buffer 未正确对齐以允许从中读取大于一个字节的数据。该作业可能被编译成三个更大实体的 Action 。

使用 memcpy() 时,没有对齐限制,它必须能够在任意两个地址之间进行复制,因此它会执行实现该操作所需的任何操作。可能逐字节复制直到地址对齐,这是一种常见模式。

顺便说一句,我发现在没有数组索引的情况下编写代码更清晰:

extern const void *buffer;
const foo my_foo = *(const foo *) buffer;

关于c - Linux 中的结构分配在 ARM 中失败但在 x86 中成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19114491/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com