题
我怎么可以获取存储器地址的价值的一个指点?在我的情况下,它是无效的指针。只是将它分配给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
在这个具体问题的原因有三:
提问者没有指定,如果他 想要一个便携式解决方案或没有。他 说,它曾与他。我不知道到底是什么 这意味着,但 这是我清楚他 工作IA-32Windows或其他 系统保护模式。那 置换指针指向 整数就是一个定义操作上 这个系统甚至如果这不是定义的标准。
第二,我提出了第一个转换的指针
int
这显然是毫无意义 litb 和 jalf 显示出我。我纠正的错误我做的,并取代int
与size_t
.最后,我想我很难找到的东西有关什么你建议作为一个解决方案的标准。不幸的是,我找不到任何相关的。我有这个参考: ANSI ISO IEC14882 2003年.我认为sellibitze指出, 将 是的一部分,未来的标准。我真的不知道C,显然C99介绍了这个完美的解决方案。我想有人告诉我一个便携式解决在C++。
请,不要犹豫,以纠正我的错误,我还是个学生在大学:)
谢谢,
其他提示
一个指针,在C和C ++的就是强>的存储器地址的某些抽象形式的实施例。你可以得到一个指针的实现特定字符串的解释为:
printf ("%p", voidPointer);
另一种方法是将它转换为使用intptr_t:
(intptr_t) voidPointer;
在C ++的NULL指针被定义为等于“0”,所以大概你会得到(使用intptr_t)0的equiavlent在上述操作。但是它仍然是取决于你和任何执行特定的知识,你必须理解,作为一个内存地址。
的一点是,在使用奇异存储器模型,如16位x86 DOS的编译器中,具有与分段偏移作为其存储器模型平台,指针可以在许多方面进行解释。在原始地址表示NULL可能是DS:0或SS:0而不是只是一个普通的0
您需要的铸造 - 无论是reinterpret_cast
(优选):
UInt32 address = reinterpret_cast<UInt32>( voidPointer );
或C样式转换(真的不推荐):
UInt32 address = (UInt32)voidPointer;
你可以得到一串表示的地址与sprintf()或显示它与printf()使用%p格式说明,e。g:
printf( "%p", voidptr ) ;
如果你只想要的地址,以执行指针算,投到一个适当的具体数据类型的指针,否则转换为一个整数如已经提出了建议。
在C ++我能够与打印尖地址:
cout << "Address: " << ((unsigned)my_ptr);