[英]Type punning: int[] and struct { int … }
我想知道根據C99標准來解釋這樣一個結構是否安全:
struct my_struct_t {
int a;
int b;
int c;
};
作為int[3]
。 即所有ABI的代碼片段是否合理?
struct my_struct_t f;
int *i = &f.a;
i[0] = 1; // f.a == 1
i[1] = 2; // f.b == 2
i[2] = 3; // f.c == 3
據我所知,標准,允許編譯器在結構中的成員之后添加填充,但是數組內部不得有任何填充。 我做對了嗎? (如果是,那么代碼示例將產生未定義的行為。)
對此唯一真正的“答案”是引用:
C11,6.7.2.1:
結構對象中可能存在未命名的填充,但不是在其開頭。 (第15段)
結構或聯合的末尾可能有未命名的填充。 (第17段)
C11,6.2.5:
數組類型描述了具有特定成員對象類型的連續分配的非空對象集(第20段)
由於下標運算符完全等效於指針算術運算,因此它不能考慮任何可能存在的填充(無論如何都是目標對象的類型),並且在結構中,它可以。
正如int
s,嗯, int
-aligned,我認為它應該在大多數平台上工作(並且它在我的Intel x86-64上使用gcc在Linux上運行)。
您可以在編譯時檢查它是否有效:
static_assert(offsetof(struct my_struct_t, c) == 2*sizeof(int));
如果這個斷言沒有失敗,標准保證你是安全的(如果我不是非常錯誤,但我想不出任何使它成為UB的東西)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.