2015-11-13 89 views
1

我在想,如果指針的數值告訴我在調試過程中有什麼用處。如果我知道數據在哪裏,我可以知道什麼數據,例如0xffffffff7fffd9d8與0x10019c1e0?

例如我已經在我的調用堆棧如下:

std::basic_ostringstream<char, std, char_traits<char>, std::allocator, <char>void>::str(
    0xffffffff7fffd9d8, 
    0x10019c1e0, 
    0x100446710, 
    0x0, 
    0xffffffff7fffd9d8, 
    0xffffffff7b331688), 
at 0xffffffff7b1b28ec 

似乎有這樣的形式0xfff0x100的指針。這種差異有意義嗎?

+0

_ 「是否有這個差值大小?」 _嗯,定義意味着更好。除了看到非常不同的內存地址範圍,你想暗示哪個_meaning_? –

+0

@πάνταῥεῖ他們存儲在不同的內存區域必須有一些原因。一個人可能在堆中嗎?就我而言,我的意思是共振,解釋明顯的不同點。 – Beginner

回答

2

在64位平臺上,理論上您可以尋址2個或者大約16個艾字節。由於大多數應用程序不需要這麼大的地址空間,硬件供應商可以定義較小的虛擬地址空間來降低地址轉換的成本。因此,在AMD和Intel芯片上,只有地址的最低有效位48位是有意義的,並且位48到63必須是位47的副本。這些地址被稱爲規範形式的地址,並且它們跨越以下範圍:

  • 0000000000000000 - 00007FFFFFFFFFFF
  • FFFF800000000000 - FFFFFFFFFFFFFFFF

前者被稱爲規範下半部地址,而後者規範的上半部分。這是內核的決定,但通常上半部分地址是指棧和靜態程序數據區,而下半部分地址是指堆內存。

來源:Wikipedia

1

有一個提示,你應該採取一粒鹽。在64位x86上,Linux堆棧地址通常位於較高範圍內,而堆地址位於較低範圍內。因此,您的0xffff表單地址可能來自堆棧,而0x100可能來自堆棧。

相關問題