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

Jos*_*eld 20 c++ memory casting representation

我们可以通过将该对象的点T转换为a 来查看类型T*对象的表示char*.至少在实践中:

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] << ' ';
}
Run Code Online (Sandbox Code Playgroud)

这输出511我的系统的表示:ff 01 00 00.

(肯定)这里发生了一些实现定义的行为.哪个演员阵容允许我将一个转换int*为一个unsigned char*转换,哪个转换是否需要转换?我一投演就调用了未定义的行为?我可以投这样的任何T*类型吗?这样做我能依靠什么?

Dav*_*men 16

哪个演员阵容允许我转换int*unsigned char*

在这种情况下,C风格的演员阵容与之相同reinterpret_cast<unsigned char*>.

我可以像这样投射任何T*类型吗?

是的,不是.是部分:您可以安全地将任何指针类型转换为char*unsigned char*(使用适当的const和/或volatile限定符).结果是实现定义的,但它是合法的.

no部分:标准明确允许char*unsigned char*作为目标类型.但是,您不能(例如)安全地投射double*int*.这样做,你已经越过了从实现定义的行为到未定义的行为的边界.它违反了严格的别名规则.


nob*_*bar 5

你的演员映射到:

unsigned char* cp = reinterpret_cast<unsigned char*>(&x);
Run Code Online (Sandbox Code Playgroud)

int定义了一个实现的底层表示,并将其作为字符查看,允许您检查它.在你的情况下,它是32位小端.

这里没有什么特别的 - 这种检查内部表示的方法对任何数据类型都有效.

C++ 03 5.2.10.7:指向对象的指针可以显式转换为指向不同类型对象的指针.除了将"指向T1的指针"的rvalue转换为"指向T2的指针"类型(其中T1和T2是对象类型,T2的对齐要求不比T1更严格)并返回其原始类型时原始指针值,这种指针转换的结果是未指定的.

这表明演员阵容导致了未指明的行为.但实际上,从任何指针类型转换为char*总是允许您检查(和修改)引用对象的内部表示.

  • 此处提供了"严格别名规则"的相关标准:http://stackoverflow.com/a/7005988/86967.概要:如果通过`char*`或`unsigned char*`访问对象,则没有问题. (2认同)