加入到「char *」指標:UB 或 Not?
C 17 定義了在指標中加入整數表達式的規則,指出當結果超出指向陣列的邊界時,會產生未定義的行為。但是,該定義專門適用於指向陣列元素的指標。
考慮以下程式碼片段:
struct Foo { float x, y, z; }; Foo f; char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*) *reinterpret_cast<float *>(p) = 42.0f;
問題是行 (*) 是否會觸發未定義的行為。儘管將 float 的位址重新解釋為 char 指針,但它並未指向 char 數組。因此,根據引用的定義,這似乎是未定義的行為。然而,如果是這種情況,offsetof 宏的實用性將受到嚴重損害。
但是,C 也允許將任何普通可複製類型的底層位元組複製到字元陣列中。此操作可以使用 std::memcpy 等函數或手動逐字節執行,不需要原始物件是數組。
因此,為了讓這些逐字節操作成功,必須為指向物件原始位元組的指標定義向指標添加整數表達式。這些位元組是否隱式形成數組或構成一般加法規則的特殊例外尚不清楚。儘管如此,任何一種解釋都可以證明所提供的程式碼範例中添加內容的有效性。因此,在此上下文中新增“char *”指標不會導致未定義的行為。
以上是當'char *”指標不指向數組時,添加到該指標是否為未定義的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!