La dichiarazione di due variabili chiamate a
rappresenta sicuramente un errore; se il tuo compilatore lo accetta, allora è rotto. Immagino tu intenda che non ricevi ancora un errore se sostituisci una dichiarazione con l'altra.
L'accesso alla matrice non è controllato. Al momento della compilazione, la dimensione di un array spesso non è nota e la lingua non richiede un controllo anche quando lo è. In fase di esecuzione, un controllo ridurrebbe le prestazioni, il che andrebbe contro la filosofia C++ di non pagare per qualcosa che non è necessario. Quindi l'accesso oltre la fine di un array dà un comportamento indefinito, ed è compito del programmatore assicurarsi che non accada.
A volte, un accesso non valido causa un errore di segmentazione, ma questo non è garantito. In genere, la protezione della memoria viene applicata solo a intere pagine di memoria, con una dimensione di pagina tipica di alcuni kilobyte. Nessun accesso all'interno di una pagina di memoria valida non verrà catturato. C'è una buona probabilità che la memoria a cui accedi contenga qualche altra variabile del programma, o parte dello stack delle chiamate, quindi scrivere lì potrebbe influenzare il comportamento del programma praticamente in qualsiasi modo tu possa immaginare.
Se si desidera essere sicuri, è possibile utilizzare std::vector
e accedere solo ai suoi elementi utilizzando la sua funzione at()
. Questo controllerà l'indice e genererà un'eccezione se è fuori portata. Gestirà anche l'allocazione della memoria per te, riparando la perdita di memoria nell'esempio.
fonte
2012-09-13 15:53:46
Sfortunatamente, il comportamento definito ** a volte ** è un sottoinsieme di comportamento non definito :( – Mahesh
@Mahesh :)) no. –
@LuchianGrigore ** A volte ** – Mahesh