据我所知,在以下行中,我们尝试写入无效的内存位置。但这实际上也是一个未对齐的指针。有人可以解释什么是未对齐的指针以及下面的未对齐指针是什么?
*(int*)0xffffffff = 0xbad;
答案 0 :(得分:16)
许多架构都有一个名为 alignment 的概念,其中硬件设计为在字大小的倍数的地址上运行。例如,在32位处理器上,对象可能与32位边界(4个字节)对齐,而在64位处理器上,对象可能与64位边界(8个字节)对齐。对齐指针是指向字大小倍数的地址的指针,未对齐指针指向不指向字大小倍数的地址的指针。
在大多数体系结构中,读取或写入未对齐的指针会受到某种惩罚。在某些处理器上,这样做会导致总线错误,这通常会立即终止程序。在其他方面,例如x86,未对齐的读取和写入是合法的,但由于硬件结构的原因会受到性能损失。
在你的代码中,0xFFFFFFFF
= 2 32 - 1可能没有对齐,因为它不是最常见字大小的倍数(它不能被2的任何幂除尽)。
希望这有帮助!