當指標不指向字元陣列時,指標加法是否未定義?
C 17 標準規定,將整數值加到指針會導致與操作數類型相同的指針,如果操作保持在數組內,則結果指向數組中的(假設的)元素界限。然而,目前尚不清楚這是否適用於不指向 char 數組的指標。
考慮以下程式碼:
struct Foo { float x, y, z; }; Foo f; char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z); // (*) *reinterpret_cast<float *>(p) = 42.0f;
標示 (*) 的行是否構成未定義行為 (布)?指標 p 指向浮點數,而不是字元陣列。根據引用的段落,這應該會導致 UB。然而,如果它是 UB,它將顯著限制 offsetof() 的實用性。
普通可複製類型的標準定義指出,可以使用 std::memcpy 等函數將其底層位元組複製到 char 陣列中。這意味著應該為指向構成物件的原始位元組的指標定義加法,無論結果是否用於將位元組複製到陣列中。
這是否意味著所涉及的位元組已經形成數組或構成對運營商通常規則的特殊例外尚不清楚。然而,任何一種解釋都會使程式碼中的添加有效。因此,可以得出結論,添加到 char * 指標並不一定會導致 UB,即使它不指向 char 數組。
以上是C 17中不指向字元陣列時指標加法是否未定義?的詳細內容。更多資訊請關注PHP中文網其他相關文章!