在标準 C 或者 C++ 中由于不支援 0 長度的數組,是以 int array[0]; 這樣的定義是非法的。不過有些編譯器的擴充功能支援 0 長度的數組。
在 C 中,0 長度的數組的主要用途是用來作為結構體的最後一個成員,然後用它來通路此結構體對象之後的一段記憶體(通常是動态配置設定的記憶體)。由于其非标準性,在程式中盡量避免使用 0 長度的數組。作為替換,可以使用 C99 标準中的不完整數組來替換 0 長度的數組定義。如:
CODE:
struct X {
/* Members */
int array[]; /* Do not write int array[0]; since it is not standard. */
};
>> 但是我的如下代碼是能順利編譯且不出警告和錯誤,而且能運作的啊
>> int array[0]
>> *array = 1;
程式中可能出現的錯誤有多種。一是文法錯誤,這類錯誤很容易在編譯階段檢查出來。除此之外,還有一類錯誤在編譯階段不能或者很難檢查出來,這類錯誤被稱為“無定義”,其結果是不确定的。
上面的代碼中因為有越界通路數組這一錯誤存在,是以它的行為(執行的結果)是無定義的。
應用比如:
struct A {
int a, b;
char data[0];
/* do not write fields below */
struct A *p;
int n = 100, i;
p = malloc(sizeof(struct A) + n);
for (i = 0; i < n; ++i)
p->data[i] = 1;