c++ - 何时以及如何允许转换为 char 指针?

标签 c++ memory casting representation

我们可以通过将指向该对象的 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 an unsigned 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/

相关文章:

c++ - 重载强制转换以使类的行为与指针相同时的正确行为

c++ - 出于对象替换的目的,对象的 "name"究竟是由什么构成的?

c++ - Direct3d 中的 vector 文本渲染系统

c++ - 选举投票递归函数 - Stanford CS106B issue

Java - 如何在 Java 中创建具有所需大小的变量?

c++ - 如何避免使用 EEPROM 而不是闪存?

c++ - 如何在 C(首选)/C++ 中按顺序将一组一维数组传递给函数

c++ - 从派生类到基类的static_cast会发生什么?

java - 二叉搜索树实例化

java - 从父类(super class)到子类的显式转换