Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;如何获取存储在空指针中的地址?_C++_Pointers_Void - Fatal编程技术网

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

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

如何获取指针指向的值的内存地址?在我的例子中,它是一个空指针。 仅将其分配给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);
// 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++定义的,

  • 其次,我建议首先将指针转换为
    int
    ,这显然毫无意义,正如litbjalf向我展示的那样。我纠正了我所犯的错误,并将
    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);