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