2010-09-28 26 views
5

Sto studiando per il mio test in C e sto leggendo in un sommario C che ho scaricato da qualche sito. È scritto che non è permesso scrivere arr[i] dove i è una variabile. L'unico modo per farlo è con malloc.
Tuttavia, ho scritto il seguente codice e compila senza avvisi e senza errore sul valgrind:Dichiarare un array con una variabile di dimensione non costante

int index = 5; 
int a4[index]; 

a4[0] = 1; 
a4[1] = 2; 

int index2; 
scanf("%d",&index2); 
int a5[index2]; 
a5[0] = 1; 
a5[1] = 2; 

Allora, qual è la verità dietro le dichiarazioni di matrice? grazie!

+0

Come avvertimento: raccomanderei di non fidarsi troppo dei sommari di C trovati su Internet; Recentemente ho passato molto tempo a rivedere C e C++ in preparazione per le interviste e ho scoperto che la maggior parte delle "guide di studio" di Internet contenevano informazioni inesatte o fuorvianti. Consiglierei [un buon libro introduttivo] (http://stackoverflow.com/questions/562303/the-definitive-c-book-guide-and-list), con l'avvertenza che spesso tali libri non coprono C99 funzionalità perché sono meno comunemente implementate. –

+1

Mentre sono legali in C99, i VLA sono * estremamente * pericolosi a meno che non si abbia già un limite molto piccolo sul valore dell'espressione da utilizzare come dimensione dell'array. Possono facilmente portare a overflow dello stack (non il buon tipo :-) e il bombardamento della memoria heap). –

risposta

14

C99 consente di creare variable length arrays nello stack. Il tuo compilatore può supportare questa funzione. Questa funzionalità non è disponibile in C89.

Ciò che il riassunto diceva era vero, da un certo punto di vista. :-)

+0

L'array di lunghezza variabile mi fa sentire inizialmente confuso perché ricordo che non è supportato quando ho imparato a usare C con VC6.0. Proprio ora trovo che è usato nel codice di esempio di InsertionSort su Hackerrank.com. Ora è chiaro. Hackerrank adotta gcc4.7.3, modalità C99, quindi questa funzione è totalmente supportata. – ChandlerQ

Problemi correlati