非陣列指標的指標算術是否未定義行為?
C 標準指定對指標進行加或減整數表達式的結果在相同類型的指標中。但是,如果指標最初指向陣列中的元素,則產生的指標也必須指向陣列中的有效元素。這就提出了一個問題:添加到實際上並不指向字元數組的“char *”指標是否是未定義行為(UB)?
考慮以下程式碼:
struct Foo { float x, y, z; }; Foo f; char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*) *reinterpret_cast<float *>(p) = 42.0f;
Line () 執行reinterpret_cast 將f 的位址轉換為「char 」指針,然後再加入z 成員的偏移量。所得的指標 p 用於修改 f.z.
根據標準,這一行的結果應該是 UB,因為 p 不指向字元陣列。然而,通常假設允許使用此類指標來操作物件的底層記憶體表示。
標準沒有明確聲明這是 UB,但它要求普通可複製類型的物件可以複製到 char 或 unsigned char 陣列中。這表明應該為指向構成物件的原始位元組的指標定義指標算術,以允許上述操作。
因此,可以合理地得出這樣的結論:添加到“char *”指標不會在底層位元組打算複製到數組中的情況下,指向字元數組的 t 不是 UB。
以上是非陣列指標上的指標算術是否有「reinterpret_cast」未定義行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!