2015-05-15 76 views
4

malloc()返回的虛擬內存指針的size_t值是否有上限?malloc()是否有最大的返回值?

我想知道我是否可以安全地設置64位指針的最重要的位,以表明這不是一個指針,而是一個文字整數。

+1

我沒有報價,但我認爲沒有說明。 'malloc'可以返回任何喜歡的東西。在實踐中,它通常是越來越多的數字,一些語言(OCaml)實際上是以安全的方式做你說的。 –

+0

'int64_t'或'uint64_t'有什麼問題? – pmg

+0

它取決於'OS'內存映射策略,因爲策略是一個實現細節,它可以從「OS」的一個版本更改爲下一個版本而沒有任何警告。我不會依賴這樣的黑客。 – axiac

回答

4

由於@ datenwolf的回答指出,您不能對malloc如何爲您提供內存地址做任何假設。如果您嘗試使用它們來存儲元數據,則MSB可能包含可覆蓋的重要位。我曾在一個32位系統上處理地址的MSB(不是從malloc,而是其他系統特定的內存分配函數)返回的地址。

但是,它保證malloc將返回適合您系統的地址。例如,在32位系統上,您將得到一個4字節對齊的指針,而在64位上,您將得到一個8字節對齊的指針。這意味着您可以保證分別爲的較低2位或3位將爲爲零。您可以使用memalign來增加保證位數。它與將元數據存儲在最重要的位上的效果基本相同。要獲取/設置文字,您可以將其上/下移至剩餘的位。

但是,我不會建議任何一種方法。節省自己的一些心痛,並分配多一點的內存來存儲國旗。除非你有數十億人,否則真的不值得。

+0

好的一個,那會有訣竅。事實上,我已經獲得了數十億,我已經解決了這個問題,但我很想知道更多關於'malloc()'的知識。 – ezorita

8

malloc返回一個不是整數的void*。將指針轉換爲整數不會給你(虛擬內存)地址,但是必須遵守C語言標準中定義的語義的一些值(0表示空指針,加法和減法與指針算術相關) ,但就是這樣。

對於除此之外的指針 - 轉換爲整數的值,您不得作任何假設。事實上,C實現可能非常適合將非空指針強制轉換爲具有高位內部信息的整數。

0

至於size_t關注能夠保存limits.h中

#ifndef SIZE_MAX 
#ifdef _WIN64 
#define SIZE_MAX _UI64_MAX 
#else 
#define SIZE_MAX UINT_MAX 

凡_UI64_MAX和UINT_MAX被定義爲followes定義的值。

#define UINT_MAX  0xffffffff /* maximum unsigned int value */ 
#define _UI64_MAX  0xffffffffffffffffui64 

而且作爲malloc()而言,在32位的Windows它可以在零任何(地址)值返回到2 GB用戶模式地址空間和在64位的Windows它可以返回任何(地址)值在0到8 TB的用戶模式地址空間內。

同樣,在32位系統上,從WinNT 4起,它引入了啓動選項/ 3G。通過這個,malloc()可以返回0到3 GB用戶模式地址空間內的任何(地址)值。

欲瞭解更多詳情,請看Mark Russinovich的文章here