首頁 >後端開發 >C++ >非數組資料結構上的指標算術在 C 中是定義的還是未定義的行為?

非數組資料結構上的指標算術在 C 中是定義的還是未定義的行為?

Linda Hamilton
Linda Hamilton原創
2024-11-28 07:44:11154瀏覽

Is Pointer Arithmetic on Non-Array Data Structures Defined or Undefined Behavior in C  ?

非陣列資料結構上的指標算術是否未定義行為?

這個問題源自於 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn