3.6 我遇到這樣聲明結構的代碼: struct name { int namelen; char namestr[1];}; 然後又使用一些內存分配技巧使 namestr  數組用起來好像有多個元素。這樣合法和可移植嗎?

這種技術十分普遍, 儘管 Dennis Ritchie 稱之為 ``和C 實現的無保證的親密接觸"。 官方的解釋認定它沒有嚴格遵守 C 標準, 儘管它看來在所有的實現中都可以工作。 仔細檢查數組邊界的編譯器可能會發出警告。

另一種可能是把變長的元素聲明為很大, 而不是很小; 在上例中:

    ...
    char namestr[MAXSIZE];
MAXSIZE 比任何可能存儲的 name 值都大。但是, 這種技術似乎 也不完全符合標準的嚴格解釋。這些 ``親密'' 結構都必須小心使用, 因為只有程序員知道它的大小, 而編譯器卻一無所知。

C99 引入了 ``靈活數組域'' 概念, 允許結構的最後一個域省略數組大小。 這為類似問題提供了一個圓滿的解決方案。

參考資料: [Rationale, Sec. 3.5.4.2]; [C9X, Sec. 6.5.2.1]。

翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)