一些結構具有靈活的陣列:(版本4.9.2)爲什麼靈活的數組成員必須在結構的結尾,但結構與靈活的數組不是?
struct SomeArray { unsigned length; int array[]; };
此代碼編譯的gcc沒有任何錯誤:
struct s1{ unsigned length; SomeArray some_array; const char * string; } ss1;
如何工作的呢?
一些結構具有靈活的陣列:(版本4.9.2)爲什麼靈活的數組成員必須在結構的結尾,但結構與靈活的數組不是?
struct SomeArray { unsigned length; int array[]; };
此代碼編譯的gcc沒有任何錯誤:
struct s1{ unsigned length; SomeArray some_array; const char * string; } ss1;
如何工作的呢?
從標準:
作爲一個特殊的情況下,與一個以上的命名構件的結構的最後一個元件可以具有一個不完整的陣列類型;這被稱爲靈活陣列成員。在大多數情況下,靈活的陣列成員被忽略。特別是,結構的大小就好像是柔性陣列成員被省略,除了它可能具有比省略暗示的更多尾隨填充。
這似乎是柔性陣列成員被忽略的情況之一。所以ss1.some_array
的大小不包括ss1.some_array.array
的空間。
§6.7.2.1的¶3中有特定約束(您在同一節中引用了來自¶18的),其中說:_結構或聯合不應包含具有不完整或函數類型的成員(因此, 結構不得包含它自己的一個實例,但可能包含一個指向它自己的實例 的指針),除了具有多於一個命名成員 的結構的最後一個成員可能具有不完整的數組類型;這樣的結構(以及任何包含,可能遞歸地包含這樣的結構的成員的聯合)不應該是數組的結構或元素的成員。_ **不應該!** –
gcc 4.8.2產生編譯錯誤,因爲'SomeArray'(注意不是'struct SomeArray')沒有被定義。 – MikeCAT
「這是如何工作的?」 - 是的,怎麼樣?你編譯時是否啓用了警告? (雖然我希望有一個錯誤) – Olaf
嗯,它的工作原因是GCC擴展? http://melpon.org/wandbox/permlink/23zsb6490RslWhV9 – MikeCAT