簡體   English   中英

C ++如何獲取存儲在void指針中的地址?

[英]C++ how to get the address stored in a void pointer?

我如何獲取指針指向的值的內存地址? 就我而言,這是一個空指針。 只是將其分配給一個uint會給我這個錯誤:

Error   1   error C2440: 'return' : cannot convert from 'void *' to 'UInt32'

謝謝!

std::size_t address = reinterpret_cast<std::size_t>(voidptr);
// sizeof(size_t) must be greater or equal to sizeof(void*)
// for the above line to work correctly.

@謝保羅
我認為在此特定問題中將void*轉換為size_t就足夠了,原因有以下三個:

  • 發問者沒有指定他是否想要便攜式解決方案。 他說,這與他合作。 我不知道這到底意味着什么,但對我來說很明顯,他正在Windows或其他系統上以保護模式運行IA-32。 這意味着將指針轉換為整數是該系統上的已定義操作,即使標准C ++未定義該操作也是如此。

  • 其次,我建議首先把指針int這是litb顯然是毫無意義和jalf我看了。 我更正了我犯的錯誤,然后將int替換為size_t

  • 最后,我努力尋找與您提議的標准解決方案相關的內容。 不幸的是,我找不到任何相關的東西。 我有以下參考資料: ANSI ISO IEC 14882 2003 我認為Sellibitze指出這是即將到來的標准的一部分。 我真的不了解C,顯然C99引入了這種完美的解決方案。 我希望有人向我展示C ++的可移植解決方案。

拜托,不要猶豫糾正我的錯誤,我仍然是uni的學生:)

謝謝,

C和C ++ 的指針某種抽象形式的內存地址的體現。 您可以通過以下方式獲得指針的特定於實現的字符串解釋:

printf ("%p", voidPointer);

另一種方法是將其強制轉換為intptr_t:

(intptr_t) voidPointer;

C ++中的NULL指針定義為等於“ 0”,因此,在上述操作中,您大概會得到(intptr_t)0的等值值。 但是,這仍然取決於您,並且您必須將任何特定於實現的知識都解釋為內存地址。

關鍵是,在使用奇怪的內存模型的平台(例如16位x86 DOS編譯器)中,其段具有偏移量的段作為其內存模型,可以用多種方式來解釋指針。 在原始地址表示中,NULL可以是DS:0或SS:0,而不僅僅是純0。

您需要強制轉換-一個reinterpret_cast (首選):

UInt32 address = reinterpret_cast<UInt32>( voidPointer );

或C樣式的強制轉換(不建議使用):

UInt32 address = (UInt32)voidPointer;

您可以使用sprintf()獲取地址的字符串表示形式,或使用%p格式說明符通過printf()顯示它,例如:

printf( "%p", voidptr ) ;

如果只希望地址執行指針算術運算,則將其強制轉換為適當的具體數據類型指針,否則按照建議將其強制轉換為整數。

在C ++中,我可以使用以下命令打印指向的地址:

cout << "Address: " << ((unsigned)my_ptr);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM