簡體   English   中英

是否允許/定義零長度可變長度數組?

[英]Are zero-length variable length arrays allowed/well defined?

我在C99編程並在我的代碼的一部分中使用可變長度數組。 我知道在C89中不允許使用零長度數組,但我不確定C99和可變長度數組。

簡而言之,以下是明確定義的行為嗎?

int main()
{
    int i = 0;
    char array[i];
    return 0;
}

不,C語言明確禁止零長度數組,即使它們是通過運行時大小值創建為VLA(如代碼示例中所示)。

6.7.5.2數組聲明符

...

5如果size是一個不是整數常量表達式的表達式:如果它出現在函數原型范圍的聲明中,則將其視為*被替換為*; 否則,每次評估它時,其值應大於零

C中不允許使用零長度數組。靜態類型數組必須具有固定的非零大小,這是一個常量表達式,而變長數組必須具有一個非零值的大小。 C11 6.7.6.2/5:

每次評估[大小表達式]時,它的值應大於零

但是,C99和C11具有結構的靈活數組成員的概念:

struct foo
{
    int a;
    int data[];
};

從C11,6.7.21 / 18:

作為一種特殊情況,具有多個命名成員的結構的最后一個元素可能具有不完整的數組類型; 這被稱為靈活的陣列成員 在大多數情況下,將忽略靈活數組成員。 特別地,結構的尺寸好像省略了柔性陣列構件,除了它可以具有比省略意味着更多的拖尾填充。 但是,當一個. (或-> )運算符有一個左操作數,它是一個帶有靈活數組成員的結構(一個指針),右操作數命名該成員,它的行為就好像該成員被最長的數組替換(具有相同的元素類型) )不會使結構大於被訪問的對象;

標准C中不允許使用零長度數組(甚至不是C99或C11)。 但是gcc確實提供了允許它的擴展。 請參閱http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM