C ++如何获取存储在void指针中的地址?

时间:2009-10-20 10:01:51

标签: c++ pointers void

如何获取指针指向的值的内存地址?在我的情况下,它是一个无效指针。 只是将它分配给一个uint给了我这个错误:

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

谢谢!

5 个答案:

答案 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);