2013-11-25 46 views
9

我知道在下面一行中,我們試圖寫入無效的內存位置。但是這實際上也是一個錯位的指針。有人可以解釋什麼是未對齊的指針,以及下面的未對齊的指針如何?什麼是未對齊的指針?

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

某些體系結構中的指針必須落在某些邊界上,例如*,一個32位字邊界,所以在這種情況下,指針的低2位需要爲零。 – lurker

回答

9

許多架構有一個叫做對準在硬件設計上是字大小的倍數地址經營理念。例如,在32位處理器上,對象可能與32位邊界(4字節)對齊,在64位處理器上,對象可能與64位邊界(8字節)對齊。一個對齊的指針指向一個地址,該地址是字長的倍數,而一個未對齊的指針指向的地址不是字長的倍數。

在大多數體系結構中,讀取或寫入未對齊的指針會遭受某種懲罰。在某些處理器上,這樣做會導致總線錯誤,通常會立即終止程序。在其他方面,比如x86,未對齊的讀取和寫入是合法的,但由於硬件結構的原因而遭受性能損失。

在您的代碼中,0xBAD = 2989可能未對齊,因爲它不是最常用字長的倍數,並且您寫入的指針也可能未對齊。

希望這會有所幫助!