我们可以通过将指向该对象的 T*
转换为 char*
来查看 T
类型的对象的表示.至少在实践中:
int x = 511;
unsigned char* cp = (unsigned char*)&x;
std::cout << std::hex << std::setfill('0');
for (int i = 0; i < sizeof(int); i++) {
std::cout << std::setw(2) << (int)cp[i] << ' ';
}
这会在我的系统上输出 511
的表示形式:ff 01 00 00
。
这里(肯定)发生了一些实现定义的行为。哪些转换允许我将 int*
转换为 unsigned char*
以及该转换需要哪些转换?我是否在施放后立即调用未定义的行为?我可以像这样转换任何 T*
类型吗?这样做时我可以依靠什么?
最佳答案
Which of the casts is allowing me to convert an
int*
to anunsigned char*
?
这种情况下的 C 风格转换与 reinterpret_cast<unsigned char*>
相同。 .
Can I cast any T* type like this?
是和不是。是的部分:您可以安全地将任何指针类型转换为 char*
或 unsigned char*
(使用适当的 const
和/或 volatile
限定符)。结果是实现定义的,但它是合法的。
没有部分:标准明确允许char*
和 unsigned char*
作为目标类型。但是,您不能(例如)安全地转换 double*
到 int*
.这样做,你就跨越了从实现定义的行为到未定义的行为的界限。它违反了严格的别名规则。
关于c++ - 何时以及如何允许转换为 char 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13995748/