簡體   English   中英

sizeof(空結構)和sizeof(空數組結構)之間的區別?

[英]Difference between sizeof(empty struct) and sizeof(struct with empty array)?

我有兩個結構定義如下:

struct EmptyStruct{

};

struct StructEmptyArr{
    int arr[0];
};

int main(void){
    printf("sizeof(EmptyStruct) = %ld\n", sizeof(EmptyStruct));
    printf("sizeof(StructEmptyArr) = %ld\n", sizeof(StructEmptyArr));

    return 0;
}

在Ubuntu 14.04,x64上用gcc(g ++)4.8.4編譯。

輸出(對於gcc和g ++):

sizeof(EmptyStruct) = 1
sizeof(StructEmptyArr) = 0

我可以理解為什么sizeof(EmptyStruct)等於1但不能理解為什么sizeof(StructEmptyArr)等於0 為什么兩者之間有差異?

在C語言中,如果定義的結構沒有任何命名成員,則程序的行為是不確定的。

C11-§6.7.2.1:

如果struct-declaration-list直接或通過匿名結構或匿名聯合不包含任何命名成員,則該行為未定義。

GCC允許使用空結構作為擴展名 ,其大小將為0


對於C ++, 標准不允許大小為0的對象,因此sizof(EmptyStruct)返回值1。
標准C ++¹不支持零長度的數組,但GNU作為擴展將其支持,並且如果應用, sizeof運算符將返回0


1.§8.5.1-腳注107)C ++沒有零長度數組。

https://gcc.gnu.org/onlinedocs/gcc/Empty-Structures.html

G ++將空結構視為具有char類型的單個成員。

https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

GNU C中允許使用零長度數組。零長度數組作為結構的最后一個元素(實際上是可變長度對象的標頭)非常有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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