2011-12-15 14 views
2

(4.1/1)左辺値が参照するオブジェクトが T型のオブジェクトではなく、T由来する種類のオブジェクトでない場合、またはオブジェクト が初期化されていない場合、プログラムそのこの変換には、未定義の動作があることが必要です( )。このことからポインタはどのようにして別の型を参照できますか?

、Iは

struct B { 
    int x; }; 

B *p; 
*p; //undefined behavior 
*p

が初期化されていないオブジェクトを指す左辺値であると仮定する。 'B'の型ではないオブジェクト、またはその派生型をどのように参照できますか?何かを誤解していますか?

答えて

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 */ } 
+0

私はそれを考えなかった! – user1086635

2

簡単。

int i; 
B *p; 
p = (B*)&i; 

完了。この例では

struct A{ int x; }; 
struct B{ float x; }; 


A x; 
B *p = (B*)&x; 

*p; // Undefined behavior 

、ポインタp ISN」:

2

一つの方法は、オブジェクトのT、または派生型ではない何かを指すようにするために、入力-しゃれするポインタではキャストでありますtはタイプBのものを指しています。これは互換性のない型Aを指しています。

この例も厳密なエイリアシングに違反しています。これも未定義の動作です。

関連する問題