2013-07-09 17 views
5

Sto programmando in C99 e uso array di lunghezza variabile in una porzione del mio codice. So che in C89 non sono ammessi array di lunghezza zero, ma non sono sicuro di C99 e array di lunghezza variabile.Gli array di lunghezza variabile a lunghezza zero sono consentiti/ben definiti?

In breve, è il seguente comportamento ben definito?

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

Questo non dovrebbe nemmeno essere compilato, visto che 'i' non è costante in fase di compilazione. – Jashaszun

+1

prova a compilarlo; gcc uscirà fuori, ti prenderà a pugni, ti sparerà e ti ruberà la macchina. –

+4

[Ragazzi ...questo è C99 ... non C89.] (http://ideone.com/NKtfJD) – Cornstalks

risposta

13

No, gli array di lunghezza zero sono esplicitamente proibite dalla linguaggio C, anche se sono creati come VLA attraverso un valore di dimensione runtime (come nel tuo esempio di codice).

6.7.5.2 Array Dichiaratori

...

Se la dimensione è un'espressione che non è un numero intero costante espressione: se si verifica in una dichiarazione alla funzione prototipo scope, viene trattato come se fosse stato sostituito da *; in caso contrario, ogni volta che viene valutato, deve avere un valore maggiore di zero.

+0

Oooo, yay, citazioni dallo standard. Mi piacciono quelli. +1! – Cornstalks

2

array di lunghezza zero non sono ammessi in C. staticamente tipizzati array devono avere un diverso da zero dimensione fissa, che è un'espressione costante, e della lunghezza della variabile array devono avere una dimensione che valuta diverso da zero; C11 6.7.6.2/5:

ogni volta che [l'espressione size] viene valutata esso ha un valore maggiore di zero

Tuttavia, C99 e C11 ha una nozione di una matrice flessibile membro di una struttura:

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

Da C11, 6.7.21/18:

Come caso speciale, l'ultimo elemento di una struttura con più di un membro nominato può avere un tipo di array incompleto; questo è chiamato membro dell'array flessibile. Nella maggior parte delle situazioni, il membro di array flessibile viene ignorato. In particolare, la dimensione della struttura è come se il membro della matrice flessibile fosse omesso, eccetto per il fatto che potrebbe avere un riempimento più lungo rispetto a che l'omissione implicherebbe. Tuttavia, quando un operatore . (o ->) ha un operando a sinistra che è (un puntatore a) una struttura con un membro di matrice flessibile e l'operando destro chiama membro , si comporta come se quel membro fosse sostituito con l'array più lungo (con lo stesso tipo di elemento ) che non renderebbe la struttura più grande dell'oggetto a cui si accede;

+0

Grazie per la nota sul membro flessibile dell'array. Quella citazione dallo standard è stata davvero utile! – Cornstalks

1

Gli array di lunghezza zero non sono consentiti in standard C (nemmeno C99 o C11). Ma gcc fornisce un'estensione per consentirlo. Vedi 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; 
Problemi correlati