2015-04-08 16 views
7

Il codice seguente dovrebbe generare un errore, poiché non è possibile che il compilatore possa conoscere la dimensione dell'array durante la compilazione.Perché questo codice non genera un errore sull'utilizzo di una dimensione di matrice variabile?

int f; 
std::cin >> f; 
int c[f]; 
c[100] = 5; 

sto compilazione con gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 e non si limita a compilare, ma funziona in qualche modo.

Come mai?

+0

Vedere [Does "int size = 10;" produce un'espressione costante?] (Http://stackoverflow.com/q/21273829/1708801) per molti più dettagli su questo argomento. –

risposta

1

C++ non esegue il controllo dei limiti dell'array. line c[100] = 5; equivale a *(c + 100) = 5;. Stai solo dicendo al compilatore di scrivere in una posizione di memoria a un certo offset da un'altra posizione di memoria. Se inserisci qualcosa di meno di 100 nel tuo programma, sovrascrivi alcuni dati nello stack. A seconda di ciò che fa il resto del codice, questo potrebbe causare un overflow dello stack, un arresto "casuale" quando una parte importante di dati viene sovrascritta, o potrebbe funzionare correttamente (e quindi iniziare a bloccarsi casualmente in seguito quando alcune modifiche apparentemente non correlate cambiano il layout di memoria).

+4

La tua descrizione è corretta, ma non molto pertinente alla domanda che riguarda davvero il perché la riga 'int c [f];' compila quando 'f' non è una costante in fase di compilazione .. – BoBTFish

+0

Ho riconosciuto quella parte. L'ho appena aggiunto per assicurarmi che stavo effettivamente creando un array. Ma penso che questo possa essere utile ad altre persone che troveranno questa domanda. – v010dya

Problemi correlati