簡體   English   中英

輸入punning:int []和struct {int ...}

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM