2011-12-24 55 views

回答

9

C和C++都不允許零長度的數組,所以你的程序不合格。

(例如,C++ 11,8.3.4/1: 「[數組大小]應大於零」。)

(作爲基本原理的一個點:零長度的陣列將是棘手的並混淆與要求每個對象有一個唯一的地址)

正如@sidyll指出,零長度數組在GCC中可用作extension

+0

它沒有在gcc編譯器中給出錯誤ubuntu 10.04 – 2011-12-24 16:18:25

+4

@ user1044137:有很多很多種方法來編寫格式不正確的C和C++程序,並且您沒有收到診斷信息。對於這個問題,我的GCC說'警告:ISO C++禁止零大小的數組'。您應該始終啓用所有警告。 – 2011-12-24 16:20:23

+1

爲什麼用** C++ **編譯器從** C **問題編譯** C **程序併發布** C++ **標準摘要? – sidyll 2011-12-24 16:28:08

3

如果您正在使用C99

  • 靈活的數組成員被寫成內容[]不爲0
  • 靈活的數組成員有不完整的你會發現在The GCC manual

    你的答案類型,所以sizeof運算符可能不適用。作爲零長度數組原始實現的一個怪癖,sizeof的計算結果爲零。

  • 靈活的數組成員可能只能作爲非空的結構的最後一個成員出現。
  • 包含靈活數組成員的結構或包含這種結構的聯合(可能是遞歸的)可能不是結構的成員或數組的元素。 (然而,這些用途是通過GCC允許作爲擴展

當然而且,它們如何可能是有用的:

零長度數組被允許在GNU C.它們是非常有用的作爲結構的最後一個元件,它是真正爲一個可變長度的對象的報頭:

struct line { 
    int length; 
    char contents[0]; 
}; 

struct line *thisline = (struct line *) 
    malloc (sizeof (struct line) + this_length); 
thisline->length = this_length; 
+1

在C11和C99中,'sizeof'並不總是編譯時操作符(僅在C89中)。 – 2011-12-24 16:33:11

1

沒有如在例子中給出多大用處,但零尺寸數組S IN結構進行了頻繁使用,其中的最後一個元素是動態調整:

struct { 
    int some_fixed_data [N_FIXED]; 
    float more_fixed_size_data [F_FIXED]; 
    int n_variable_elements; 
    long variable_elements [0]; // allocated based on item above 
} s; 

int curlen = sizeof s + sizeof long * s.n_variable_elements; 

使用零長度數組的是:

1)variable_elements具有地址(儘管某人的回答)
2)它還具有陣列語義
3)計算所述陣列的動態大小是簡化

不幸的是,一些編譯器(MSC)拋出一個噓聲像配合在這樣的結構中,並迫使在較小,安撫,在技術上不正確重新配製:

struct { 
    int some_fixed_data [N_FIXED]; 
    float more_fixed_size_data [F_FIXED]; 
    int n_variable_elements; 
    long variable_elements [1]; // allocated based on item above 
} s; 

int curlen = sizeof s + sizeof long + (s.n_variable_elements - 1); 

將零大小數組看作佔位符。除非你被迫使用C這是很多嵌入式環境的情況,否則幾乎沒有必要這樣做。

相關問題