如何获取指针指向的值的内存地址?在我的情况下,它是一个无效指针。 只是将它分配给一个uint给了我这个错误:
Error 1 error C2440: 'return' : cannot convert from 'void *' to 'UInt32'
谢谢!
答案 0 :(得分:11)
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.
@Paul Hsieh
我认为在这个具体问题中将void*
转换为size_t
就足够了,原因有三:
提问者没有说明他是否 想要一个便携式解决方案。他 说,它与他合作。我不确切知道是什么 这意味着但是 我很清楚他是谁 在Windows或其他方面使用IA-32 保护模式下的系统。那 意味着将指针转换为 integer是一个已定义的操作 该系统,即使它没有由标准C ++定义。
其次,我建议首先将指针转换为int
,这显然毫无意义,因为 litb 和 jalf 向我展示。我纠正了我所犯的错误,并将int
替换为size_t
。
最后,我努力寻找与您提出的标准解决方案相关的内容。不幸的是,我找不到任何相关的东西。我有这个参考: ANSI ISO IEC 14882 2003 。我认为sellibitze指出它将成为未来标准的一部分。我真的不知道C,显然C99推出了这个完美的解决方案。我希望有人能用C ++向我展示一个可移植的解决方案。
请,请不要犹豫,纠正我的错误,我仍然是大学的学生:)
谢谢,
答案 1 :(得分:10)
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.
答案 2 :(得分:1)
你需要一个演员阵容 - reinterpret_cast
(最好):
UInt32 address = reinterpret_cast<UInt32>( voidPointer );
或C风格演员(真的不推荐):
UInt32 address = (UInt32)voidPointer;
答案 3 :(得分:1)
您可以使用sprintf()获取地址的字符串表示形式,或使用%p格式说明符将其显示为printf(),例如:
printf( "%p", voidptr ) ;
如果您只想让地址执行指针运算,请将其强制转换为适当的具体数据类型指针,否则将其转换为已建议的整数。
答案 4 :(得分:0)
在C ++中,我能够用:
打印指向的地址cout << "Address: " << ((unsigned)my_ptr);