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