我可以通过C++中的(unsigned)char*读取任何可读的有效内存位置吗?

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*指针的正确工具?

Dam*_*mon 6

C++假定严格别名,这意味着两个根本不同类型的指针不会为同一个值设置别名.

但是,正如bdonlan正确指出的那样,该标准是一个例外charunsigned char指针.

因此,一般而言这是任何指针类型阅读未定义行为蓄意地址(可以是任何类型),但对于特定的情况下,unsigned char如问题是允许的(ISO 14882:2003 3.10(15)).

static_cast进行编译时类型检查,因此不太可能始终有效.在这种情况下,你会想要reinterpret_cast.

  • 这不是真的 - 任何想出更好主意的人都可以搜索"reinterpret_cast" - 他们无法搜索C风格的演员阵容.此外,C风格的强制转换可以在没有警告的情况下变得更糟糕,例如`const_cast`. (2认同)