Mar*_* Ba 5 c++ string pointers memory-access void-pointers
我的搜索foo今天似乎缺乏.
我想知道根据标准C++ 是否合法通过(unsigned(?))char*检查"任何"内存位置.通过任何位置我的意思是任何有效的程序内的对象或阵列(或阵列的内部)的地址.
举例来说:
void passAnyObjectOrArrayOrSomethingElseValid(void* pObj) {
unsigned char* pMemory = static_cast<unsigned char*>(pObj)
MyTypeIdentifyier x = tryToFigureOutWhatThisIs(pMemory);
}
Run Code Online (Sandbox Code Playgroud)
免责声明:这个问题纯粹是学术性的.我不打算把它放到生产代码中!通过法律我的意思是,如果它是真正的法律依据的标准,那就是是否会在所有的实现100%的工作.(不仅仅是在x86或一些常见的硬件上.)
子问题:是否是static_cast从void*地址到char*指针的正确工具?
C++假定严格别名,这意味着两个根本不同类型的指针不会为同一个值设置别名.
但是,正如bdonlan正确指出的那样,该标准是一个例外char和unsigned char指针.
因此,一般而言这是任何指针类型阅读未定义行为蓄意地址(可以是任何类型),但对于特定的情况下,unsigned char如问题是允许的(ISO 14882:2003 3.10(15)).
static_cast进行编译时类型检查,因此不太可能始终有效.在这种情况下,你会想要reinterpret_cast.