x86_64體系結構上Linux 3.0上的進程具有64位虛擬地址空間。x86_64 Linux 3.0:無效的內存地址
很明顯0
被保證是一個無效的內存地址[見下面的定義]在這個地址空間,因爲這是用來表示一個NULL
指針。
還有什麼其他的64位數字(如果有的話)永遠不會是有效的內存地址,爲什麼?
例如,1
可以是有效的地址嗎?那麼2^64-1
?
定義:你是什麼意思「保證是無效的內存地址」?
void deref_and_assign(uint64_t i)
{
char* p = (char*) i;
*p = 42;
}
對於這個問題的目的,保證無效的內存引用意味着函數deref_and_assign
總會提高一個SIGSEGV
。
出於好奇,爲什麼這是你要找的信息嗎?這可能不是您應該基於代碼編寫的信息。當然,對於研究,任何事情都會發生。;) –
好奇心不錯。我正在實現一個不可移植的動態類型(對於Linux/x86_64目標),並且我正在考慮我的選項,只要將超前的64位值「代碼單元」過載即可。一種方法是將代碼單元劃分爲(a)即時值和(b)指向更多信息的指針。作爲一個簡單的例子,你可以表示一個動態數字/字符串類型,如下所示:(0-4095)它是一個數字,表示爲整數0,1,2 ... 4095; (4096-2^64)這是一個指向空終止字符串的指針。對於一個更真實世界的例子來看看rubys VALUE類型是如何工作的。 ruby.tgz中的ruby.h –