首頁 >後端開發 >C++ >C 定義行為中的非字元陣列上的指標算術嗎?

C 定義行為中的非字元陣列上的指標算術嗎?

Linda Hamilton
Linda Hamilton原創
2024-11-09 09:59:02948瀏覽

Is Pointer Arithmetic on Non-Character Arrays in C   Defined Behavior?

非字元陣列上的指針算術

在C 中,對於引用數組或點的指針,指針算術的行為是明確定義的到數組的開頭。但是,當指標算術應用於不直接指向字元陣列的指標時,就會出現問題。

考慮以下程式碼片段:

struct Foo {
    float x, y, z;
};

Foo f;
char *p = reinterpret_cast<char *>(&f) + offsetof(Foo, z);

標有 (*) 的有問題的行將 Foo 結構體的 z 成員的位址分配給 p 指標。根據標準(expr.add/4),此操作可以被視為未定義行為(UB),因為 p 不指向 char 陣列。

但是,標準也指出任何的底層位元組普通可複製物件可以複製到 char 或 unsigned char 陣列中。這意味著指標算術對於指向構成物件的原始位元組的指標應該是有效的,無論它們是否形成數組。

在這種特定情況下,程式碼背後的意圖是存取 z 成員使用reinterpret_cast。雖然標準沒有明確規定在這種情況下定義指針算術,但如果沒有的話,就會極大地限制 offsetof 的用處。

因此,行 (*) 中的加法被認為有效 在 C 語言中。 p 上的指標算術是允許的,並且它正確地指向 Foo 結構中的 z 成員。

以上是C 定義行為中的非字元陣列上的指標算術嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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