非陣列資料結構上的指標算術是否未定義行為?
這個問題源自於 C 17 標準之間關於指針的明顯衝突offsetof 巨集的加入與功能。根據引用的段落,如果「char 」指標不指向 char 數組,則添加它應該會導致未定義的行為。然而,提供的程式碼範例涉及添加到從reinterpret_casting“Foo”結構的位址獲得的“char ”指標。這似乎不符合規則,因為指標不指向 char 陣列。
但是,在進一步檢查標準後,我們在第3.9.2 節中找到了指導:「對於任何物件(除基類子物件外)普通可複製類型T,無論該物件是否持有類型T 的有效值,組成該物件的基礎位元組都可以複製到char 或unsigned數組中char."
此聲明表明標準將任何物件的底層位元組視為可複製,無論它們是否表示數組。這意味著您在程式碼中執行的加法應該是有效的,即使指標沒有指向陣列。加法是在原始位元組上定義的,結果值用於存取「Foo」結構中所需的 float 成員。
因此,提供的程式碼範例中的加法操作不是未定義的行為。它允許您使用reinterpret_casting和offsetof來存取和修改表示結構成員的位元組。
以上是非數組資料結構上的指標算術在 C 中是定義的還是未定義的行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!