天天看點

長度為0的數組隻用在結構體的最後一個成員,用以做一個位址标記,以後用。

在标準 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;

繼續閱讀