C++ C++;如何获取存储在空指针中的地址?
如何获取指针指向的值的内存地址?在我的例子中,它是一个空指针。 仅将其分配给uint会产生以下错误:C++ C++;如何获取存储在空指针中的地址?,c++,pointers,void,C++,Pointers,Void,如何获取指针指向的值的内存地址?在我的例子中,它是一个空指针。 仅将其分配给uint会产生以下错误: Error 1 error C2440: 'return' : cannot convert from 'void *' to 'UInt32' 谢谢 std::size\u t address=reinterpret\u cast(voidptr); std::size_t address = reinterpret_cast<std::size_t>(voidptr);
Error 1 error C2440: 'return' : cannot convert from 'void *' to 'UInt32'
谢谢 std::size\u t address=reinterpret\u cast(voidptr);
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.
//sizeof(size_t)必须大于或等于sizeof(void*)
//使上述线路正常工作。
@谢国宝
我认为在这个具体问题中将
void*
转换为size\t
就足够了,原因有三:
- 提问者没有具体说明他是否 是否需要便携式解决方案。他 他说,这对他起了作用。我不知道到底是什么 这意味着 我很清楚他是 在Windows或其他系统上使用IA-32 系统处于保护模式下。那个 表示将指针转换为 integer是在上定义的操作 该系统即使不是由标准C++定义的,
- 其次,我建议首先将指针转换为
,这显然毫无意义,正如litb和jalf向我展示的那样。我纠正了我所犯的错误,并将int
替换为int
size\u t
- 最后,我努力在标准中找到与您提出的解决方案相关的内容。不幸的是,我找不到任何相关的东西。我有以下参考资料:ANSI ISO IEC 14882 2003。我认为sellibitze指出,这将是未来标准的一部分。我真的不知道C,显然C99引入了这个完美的解决方案。我想有人给我看一个C++的便携解决方案。
谢谢,您需要一个演员阵容-或者是一个
重新解释演员阵容
(更好):
一个指针,在C和C++中,强>是<强>内存地址的抽象形式。您可以获得指针的特定于实现的字符串解释,如下所示:
printf ("%p", voidPointer);
另一种方法是将其转换为intptr\t:
(intptr_t) voidPointer;
C++中的空指针定义为等于“0”,所以在上面的操作中,你可能得到(ItpRtRT)0的等价物。然而,这仍然取决于您和任何实现特定的知识,您必须将其解释为内存地址
关键是,在使用奇怪内存模型的平台中,如16位x86 DOS编译器,其内存模型是带有偏移量的段,指针可以用多种方式解释。在原始地址表示中,NULL可以是DS:0或SS:0,而不仅仅是普通的0 您可以使用sprintf()获取地址的字符串表示形式,或使用%p格式说明符使用printf()显示地址,例如:
printf( "%p", voidptr ) ;
如果您只希望地址执行指针算术,则将其转换为一个适当的具体数据类型指针,否则将其转换成已建议的整数。C++中的
< P>可以用“/P>”打印尖地址。cout << "Address: " << ((unsigned)my_ptr);
我可以在sizeof(UInt32)==sizeof(void*)
上插入一个(BOOST)静态断言,您已经有了地址。这就是指针。你的意思是“我如何得到C++映射地址的整数?”;如果要打印值,只需打印void*。如果你想要地址,就保留空白*。如果希望变量的地址为void*,则将其分配给void*。在64位系统上,sizeof(int)!=sizeof(void*)只有当整数类型“足够大”,往返指针->整数->指针是无损的,从指针到其中一个整数类型的重新解释才是格式正确的。实际上,在大多数框中,size\t
应该足够大(但理论上没有保证)。即使我们忽略int可能小于void*的问题,您至少可以使用无符号数据类型。;)负地址并没有真正的意义。“…而ptrdiff_t…显然必须覆盖整个指针空间范围”@保罗:我不这么认为。这种语言的记忆模式是“一个或多个连续字节序列”。指针算法仅限于来自同一“序列”的指针。我认为一个pTrDrimtIt不一定足够大,可以保存一个C++。无论如何,如果voidPointer是空指针,并且intptr_t是一个足够大的整数的适当类型定义,那么您确定标准保证(intptr_t)voidPointer的计算结果为0吗?我想没有。它只表示如果将指针强制转换为另一个指针,则空指针值将映射为空指针值。但是,对于某个指针的空指针值实际上可能被表示为0xDead Brand之类的东西,而不一定是整数零点。- 1,在C++中没有保证,<代码>(整型)空指针< /C> >计算为<代码> 0 < /代码>,当然。您将“NULL”与“NULL指针”混淆。阅读
printf( "%p", voidptr ) ;
cout << "Address: " << ((unsigned)my_ptr);