今天我的搜索工具好像有点不太靠谱。我想知道在标准C++中是否能够通过一个(无符号的(?))char *来检查“任何”内存地址,其中“任何”是指程序内任何对象或数组(或其内部)。所以我想请问这种操作是否合法。
举个例子:
举个例子:
void passAnyObjectOrArrayOrSomethingElseValid(void* pObj) {
unsigned char* pMemory = static_cast<unsigned char*>(pObj)
MyTypeIdentifyier x = tryToFigureOutWhatThisIs(pMemory);
}
免责声明:这个问题纯粹是学术性质的,我并不打算将其用于生产代码!在“法律”方面,我指的是如果它确实符合标准,也就是说它能够在所有实现中都工作。 (不仅仅是在x86或一些常见硬件上。)
子问题:使用static_cast
从void*地址获取char*指针是否正确?
reinterpret_cast
- 但他们搜不到 C 风格转换。此外,C 风格转换可能会变成更糟糕的转换而没有警告,例如const_cast
。 - Puppyreinterpret_cast
进行文本搜索是一个非常大的优点,我从未想过这一点。 - Damonunsigned char
和char
可以与任何其他类型别名;请参见ISO/IEC 9899:1999(E) §6.5/7的最后一条以及脚注73。然而,出于其他原因传递任意地址(即不是从有效对象的地址获取的地址)是未定义的行为(§6.5.6/8、§6.5.3.2/4等)。 - bdonlanstatic_cast
在编译时进行类型检查,因此它不太可能......") -- 既然我传递了一个void*
,那么static_cast
没有什么可以检查的。这里的问题实际上是使用static_c
还是reinterpret_c
,由于我不需要任何转换将对象转换为指向 void 的指针(即void* p = &object;
是有效的),所以我认为static_c
比reinterpret_c
更合适。显然,如果我直接将对象强制转换为 char 类型,则需要reinterpret_c
,因此这也可以成为在此处使用reinterpret_c
的论据。 - Martin Ba