(4.1 / 1)如果左值引用的对象不是对象 类型T并且不是从T 派生的类型的对象,或者是对象 是未初始化的,需要进行此转换的程序 未定义的行为。
由此,我假设
struct B {
int x; };
B *p;
*p; //undefined behavior
*p
是一个引用未初始化对象的左值。它如何引用不是'B'类型或其派生类型的对象?我误解了什么吗?
答案 0 :(得分:3)
易:
int n = 5;
double * p = reinterpret_cast<double*>(&n);
*p += 1.0; // undefined behaviour: p points to an int, not a double
++*reinterpret_cast<int*>(p); // legal; pointer can be cast back-and-forth
不太容易:
union bogus { int * a; double * b; } B;
int n;
B.a = &n;
*B.b += 1.0; // undefined behaviour
常见的C陷阱(产生无诊断!):
void do_a(void * p) { ++*reinterpret_cast<int*>(p); }
void do_b(void * p) { *reinterpret_cast<double*>(p) += 1.0; }
int main() { int n = 4; do_b(&n); /* eek */ }
答案 1 :(得分:2)
易。
int i;
B *p;
p = (B*)&i;
完成。
答案 2 :(得分:2)
使它指向不属于对象T或派生类型的东西的一种方法是使用指针强制转换来打字:
struct A{ int x; };
struct B{ float x; };
A x;
B *p = (B*)&x;
*p; // Undefined behavior
在此示例中,指针p
未指向B
类型的某些内容。它指向A
类型的某些内容,它是不兼容的。
请注意,此示例还违反了严格别名 - 这也是未定义的行为。