2017-04-10 7 views
1

char *intの配列を指す)型のポインタに対してポインタの演算をsizeof(int)の刻みで実行し、後で逆参照することは未定義の動作ですか? など。以下のコードを検討してください。それは未定義の振る舞いを引き起こしますか?sizeof(T)インクリメントのバイトワイズポインタ算術:未定義の動作?

私は/*1*/の行が合法でなければならないと確信しています。/*2*/は確かに合法ですが、私は/*3*/については不明です。

prior questionが似たような質問をしましたが、回答が受け入れられていません。

int foo() { 
    int arr[10] = {0}; 
    int i = 4; 
    int s = sizeof(int); 
    /*1*/ const char * cmem = reinterpret_cast<const char*>(&arr[0]); 
    /*2*/ cmem += i * s; 
    /*3*/ return *reinterpret_cast<const int*>(cmem); 
} 
+1

大丈夫です。 タイプTのポインタp1と同じアドレスを指すcharポインタp2を持つ場合、 'p1 + i'は '*(p2 + i * sizeof)に等しくなります。 (T)) 'となる。 –

答えて

2

このコードは問題ありません。オブジェクトの境界内(または境界を越えて)でポインタ演算を行うことができ、厳密なエイリアシング規則では、const -nessの異なる左辺のみを実際のオブジェクトから使用してそのオブジェクトにアクセスすることができます。

関連する問題