首頁 > 後端開發 > C++ > 非陣列指標上的指標算術是否有「reinterpret_cast」未定義行為?

非陣列指標上的指標算術是否有「reinterpret_cast」未定義行為?

Patricia Arquette
發布: 2024-11-08 15:12:01
原創
1103 人瀏覽過

Is Pointer Arithmetic on Non-Array Pointers with `reinterpret_cast` Undefined Behavior?

非陣列指標的指標算術是否未定義行為?

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板