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

cla*_*amp 1 c++ pointers void

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

Error   1   error C2440: 'return' : cannot convert from 'void *' to 'UInt32'
Run Code Online (Sandbox Code Playgroud)

谢谢!

Ara*_*raK 12

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.
Run Code Online (Sandbox Code Playgroud)

@保罗谢
我认为这是足以转化void*size_t在这一特定问题的原因有三:

  • 提问者没有说明他是否想要便携式解决方案.他说,这与他合作.我不知道究竟是什么意思,但我很清楚他在Windows或其他受保护模式的系统上工作IA-32.这意味着将指针转换为整数是该系统上定义的操作,即使它没有由标准C++定义.

  • 其次,我建议首先转换的指针int,这显然是毫无意义litbjalf我看了.我纠正了我所犯的错误,并替换intsize_t.

  • 最后,我努力寻找与您提出的标准解决方案相关的内容.不幸的是,我找不到任何相关的东西.我有这个参考:ANSI ISO IEC 14882 2003.我认为sellibitze指出它将成为未来标准的一部分.我真的不知道C,显然C99推出了这个完美的解决方案.我希望有人能用C++向我展示一个可移植的解决方案.

请不要犹豫,纠正我的错误,我仍然是大学的学生:)

谢谢,

  • 在64位系统上sizeof(int)!= sizeof(void*) (7认同)
  • 如果整数类型"足够大",那么来自指向其中一个整数类型的指针的reinterpret_cast只能很好地形成,以便往返指针 - >整数 - >指针是无损的. (2认同)

Pau*_*ieh 11

C和C++ 的指针某种抽象形式的存储器地址的实施例.您可以获得指针的实现特定字符串解释:

printf ("%p", voidPointer);
Run Code Online (Sandbox Code Playgroud)

另一种方法是将其强制转换为intptr_t:

(intptr_t) voidPointer;
Run Code Online (Sandbox Code Playgroud)

C++中的NULL指针定义为等于"0",因此可能在上面的操作中得到(intptr_t)0的等价.但是,您仍然需要将您作为内存地址解释为具体的实现知识.

关键在于,在使用奇怪的内存模型(如16位x86 DOS编译器)的平台中,它们具有偏移量作为其内存模型的段,可以通过多种方式解释指针.在原始地址表示中,NULL可以是DS:0或SS:0,而不仅仅是普通的0.

  • intptr_t还不是C++的一部分.无论如何,你确定标准保证(intptr_t)voidPointer在voidPointer是空指针的情况下求值为0而intptr_t是一个足够大的整数的正确typedef吗?我不这么认为.它只表示如果指针被转换为另一个指针,则空指针值将映射到空指针值.但是某些指针的空指针值实际上可能表示为类似0xDEADBEEF - 不一定是整数零. (2认同)