最近遇到了非对齐字节访问的bug,于是做了一个实验,遇到了一些疑惑,如下:
为什么当我下面的代码访问非对齐字节时系统不会崩溃?
什么情况下unsigned char buff变量的起始地址会是2的倍数而不是4的倍数?
我使用的ARMCC编译器没有启用编译器优化。
struct xxx {
unsigned char a;
unsigned char b;
unsigned char c;
unsigned int d;
unsigned char e;
unsigned char f;
}__attribute__((packed));
unsigned char buff[100];
int main()
{
struct xxx aaa;
aaa.d = 0xffffffff;
return 0;
}
为什么当我下面的代码访问非对齐字节时系统不会崩溃?
你认为为什么会这样? ARM 具有
STRB
/LDRB
指令,用于将单个字节从寄存器移动到内存,反之亦然。