2009-03-30 12 views
6

La mia comprensione è sempre stata che quando dichiaro una matrice sullo stack con una dimensione che entra come variabile o parametro, dovrei ricevere un errore.Perché non viene visualizzato un errore di compilazione quando si dichiara un array C di dimensioni variabili?

Tuttavia, ho notato che non ottengo alcun errore se non si inizializza esplicitamente l'array (sì, non sarà in pila, ma mi chiedo in merito alla mancanza di errori). Ad esempio, il seguente codice non compila a causa di array2:

#define N 30 

void defineArrays(int n) 
{ 
    int i,j; 
    int array1[N] = {}; 

    int array2[n] = {}; 

    for(i=0; i<N; ++i) array1[i] = 0; 

    for(j=0; j<n; ++j) array2[j] = 0; 
} 

Ma il seguente codice compilato ed eseguito, anche quando mando un vero n da principale:

#define N 30 

void defineArrays(int n) 
{ 
    int i,j; 
    int array1[N] = {}; 

    int array2[n]; 

    for(i=0; i<N; ++i) array1[i] = 0; 

    for(j=0; j<n; ++j) array2[j] = 0; 
} 

Quello che mi manca Qui? Sta dichiarando array2 come un puntatore? Sto usando gcc

Aggiornamento: Grazie per tutti coloro che hanno risposto. Il problema era in effetti che la mia versione di gcc era predefinita per C99 per qualche strana ragione (o non così strana, forse sono solo troppo vecchia), e ho assunto erroneamente che fosse impostato su C90 a meno che non lo dicessi diversamente.

risposta

14

C99 ha introdotto la possibilità di disporre di matrici di lunghezza variabile che sono ora disponibili in GCC (anche se è segnalato come non conforme agli standard). Nel secondo esempio, sembra che tu stia sfruttando questa funzionalità.

link alle info del GCC sugli array di lunghezza variabile: http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

+0

Accidenti, non ho realizzato default gcc a C99 ora. Ho usato g ++ per troppo tempo. – Uri

+0

@Uri No +1 sulla tua domanda, a causa del tuo curseword. – Alex

3

penso che è necessario scegliere voi C versione standard.

gcc -fsyntax-only -std=c89 -pedantic -x c - 

<stdin>: In function ‘defineArrays’: 
<stdin>:6: warning: ISO C forbids empty initializer braces 
<stdin>:8: warning: ISO C90 forbids variable length array ‘array2’ 

vs.

gcc -fsyntax-only -std=c99 -pedantic -x c - 
<stdin>: In function ‘defineArrays’: 
<stdin>:6: warning: ISO C forbids empty initializer braces 
1

dichiara la matrice con un inizializzatore costringe la matrice per essere statiche (creato al momento della compilazione) anche se la portata è all'interno della funzione. Il compilatore non può definire l'array in fase di compilazione perché non conosce il valore di 'n'.

+0

Capisco, ma perché sono in grado di compilare il secondo? – Uri

1

Quando compilo il primo esempio con gcc, mi dà questo errore:

error: variable-sized object may not be initialized 

Immagino che questo non è consentito, perché non si sa quanto grande n sarà, e quindi non si può assicurati che sia abbastanza grande da contenere tutti gli elementi che stai tentando di inizializzare. Cioè, si supponga di avere il codice come questo:

int array2[n] = { 1, 2, 3, 4 }; 

Ciò richiede che array2 hanno (almeno) 4 slot. Cosa succede se n viene passato come zero?

Il secondo esempio non presenta questo problema perché non si sta facendo alcuna dichiarazione implicita sulla dimensione di array2.

Speranza che aiuta,

Eric Melski

Problemi correlati