回答
由於@ datenwolf的回答指出,您不能對malloc
如何爲您提供內存地址做任何假設。如果您嘗試使用它們來存儲元數據,則MSB可能包含可覆蓋的重要位。我曾在一個32位系統上處理地址的MSB(不是從malloc
,而是其他系統特定的內存分配函數)返回的地址。
但是,它是保證malloc
將返回適合您系統的地址。例如,在32位系統上,您將得到一個4字節對齊的指針,而在64位上,您將得到一個8字節對齊的指針。這意味着您可以保證分別爲的較低2位或3位將爲爲零。您可以使用memalign
來增加保證位數。它與將元數據存儲在最重要的位上的效果基本相同。要獲取/設置文字,您可以將其上/下移至剩餘的位。
但是,我不會建議任何一種方法。節省自己的一些心痛,並分配多一點的內存來存儲國旗。除非你有數十億人,否則真的不值得。
好的一個,那會有訣竅。事實上,我已經獲得了數十億,我已經解決了這個問題,但我很想知道更多關於'malloc()'的知識。 – ezorita
malloc返回一個不是整數的void*
。將指針轉換爲整數不會給你(虛擬內存)地址,但是必須遵守C語言標準中定義的語義的一些值(0表示空指針,加法和減法與指針算術相關) ,但就是這樣。
對於除此之外的指針 - 轉換爲整數的值,您不得作任何假設。事實上,C實現可能非常適合將非空指針強制轉換爲具有高位內部信息的整數。
至於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。
- 1. numpy.linalg.cond是否返回最大和最小特徵值的比率?
- 2. 返回值最大
- 3. MAX函數沒有返回最大值,返回的所有值,而不是
- 4. C中的malloc - 返回值
- 5. matplotlib返回的PSD頻率最大值是否錯誤?
- 6. waveOutGetVolume()總是返回4294967295(最大值)
- 7. 如果cmake BUILD目錄是最新的,是否有返回值?
- 8. MySQL的最大值()沒有返回最大結果
- 9. QueryDSL返回最大值
- 10. scipy.minimize最大返回值
- 11. Process.WorkingSet64返回最大值4294967295
- 12. 最大malloc大小
- 13. 哪個指針值是malloc調用的最大值
- 14. malloc的返回值,而條件
- 15. malloc的返回值是虛擬地址還是物理地址?
- 16. 返回最大值和值之前
- 17. 是否有可能從set_trace_func返回值?
- 18. std :: cout是否有返回值?
- 19. 返回最大值的單行
- 20. find()返回unsigned int的最大值
- 21. 返回數組中的最大值
- 22. 返回最大值的列表索引
- 23. 返回索引的最大值
- 24. 查詢返回一列的最大值
- 25. 返回最大值的文檔
- 26. 返回最大值閉包的函數
- 27. 函數返回最大值的對象
- 28. 返回數組中的最大值?
- 29. 如何返回最大值的多行
- 30. SQL:SUM返回結果的最大值
我沒有報價,但我認爲沒有說明。 'malloc'可以返回任何喜歡的東西。在實踐中,它通常是越來越多的數字,一些語言(OCaml)實際上是以安全的方式做你說的。 –
'int64_t'或'uint64_t'有什麼問題? – pmg
它取決於'OS'內存映射策略,因爲策略是一個實現細節,它可以從「OS」的一個版本更改爲下一個版本而沒有任何警告。我不會依賴這樣的黑客。 – axiac