2013-11-25 47 views
9

我知道在下面一行中,我们试图写入无效的内存位置。但是这实际上也是一个错位的指针。有人可以解释什么是未对齐的指针,以及下面的未对齐的指针如何?什么是未对齐的指针?

*(int*)0xffffffff = 0xbad; 
+2

某些体系结构中的指针必须落在某些边界上,例如*,一个32位字边界,所以在这种情况下,指针的低2位需要为零。 – lurker

回答

9

许多架构有一个叫做对准在硬件设计上是字大小的倍数地址经营理念。例如,在32位处理器上,对象可能与32位边界(4字节)对齐,在64位处理器上,对象可能与64位边界(8字节)对齐。一个对齐的指针指向一个地址,该地址是字长的倍数,而一个未对齐的指针指向的地址不是字长的倍数。

在大多数体系结构中,读取或写入未对齐的指针会遭受某种惩罚。在某些处理器上,这样做会导致总线错误,通常会立即终止程序。在其他方面,比如x86,未对齐的读取和写入是合法的,但由于硬件结构的原因而遭受性能损失。

在您的代码中,0xBAD = 2989可能未对齐,因为它不是最常用字长的倍数,并且您写入的指针也可能未对齐。

希望这会有所帮助!