2013-10-02 14 views
7

È valido in linguaggio C?Definizione della dimensione dell'array usando la variabile

#include <stdio.h> 
int main() 
{ 
    int i = 5; 
    int a[i];  // Compiler doesn't give error here. Why? 
    printf("%d",sizeof(a)); //prints 5 * 4 =20. 4 is the size of integer datatype. 
    return 0; 
} 

compilatore non dà errore alla dichiarazione int a[i];. non è una costante quindi come può essere compilata con successo? È perché sto usando il compilatore gcc? È permesso in C++?

+0

La discussione in [la mia risposta qui] (http://stackoverflow.com/a/21273849/1708801) su ciò che è un'espressione costante rispetto agli array di lunghezza variabile è rilevante. –

risposta

17

Sì, questo è valido a partire da C99 e viene chiamato variable-length array (VLA). In altre parole, è stato in uno standard di lingua ufficiale per circa 14 anni.

No, non è valido in C++, see this question per i dettagli.

Si noti inoltre che sizeof non è una funzione, pertanto può essere scritto come printf("%zu\n", sizeof a); che utilizza anche l'identificatore di formato appropriato per un valore size_t.

+0

Ok, grazie. Gcc compila anche un programma c usando le regole per C++? Posso dichiarare le variabili dopo aver usato la funzione printf e non dà errore. – user221458

+3

@ user221458 Si prega di * leggere * il testo su C99, dal momento che sembra che tu sia molto inconsapevole della lingua che stai cercando di usare. Puoi dichiarare le variabili più liberamente in C99. – unwind

+0

VLA è supportato anche in C++. L'ho appena controllato – user221458

0

Avevo solo aggiungere per rilassarsi Rispondiamo che in C++ 14, ci saranno gli array di runtime dimensioni, che lavorano più o meno come VLA.

vedi capitolo 8.3.4 a N3690 (array of runtime bound of T)

Sembrano essere supportato in clang-3.3 (in modalità C++ 1A), ma non nel GCC 4.8 (il supporto dovrebbe venire in GCC 4.9) . Quando si scrive il codice in modalità pre-C++ 14 (C++ 03, C++ 11), il codice verrà probabilmente compilato, ma dovrebbe emettere un avviso sull'utilizzo di una funzione C99 non supportata in C++.

E si dovrebbe sempre compilare con la maggior parte delle avvertenze pedanti abilitato :)

2

Questo è valido C99 si chiama Variable Length Array (VLA) gcc supporta VLA as an extension al di fuori del C99 modalità rispetto al C++ sia gcc sia clang supportano matrici di lunghezza variabile come un'estensione anche se questa è veramente una funzione C99.

si può costruire utilizzando l'argomento -pedantic in gcc e clang entrambi darà un simile avvertimento al seguente:

warning: variable length arrays are a C99 feature [-Wvla-extension] 

sizeof dovrebbe funzionare correttamente con VLA anche se sarà valutata al posto di un costante intera. Sebbene tu abbia undefined behavior nel tuo codice poiché hai specificato l'identificatore di formato errato per size_t che è zu e non d.La C99 draft standard nella sezione 7.19.6.1La funzione fprintf quale sezione printf s' rimanda per la stringa di formato di paragrafo dice:

Se una specifica di conversione non è valido, il comportamento è indefinito [.... ]

Problemi correlati