Errore fuori dall'intervallo del pedice vettoriale C ++

Errore fuori dall'intervallo del pedice vettoriale C ++
Quando un abbonamento è stato emesso un errore fuori porta. Tuttavia, questo dipende dal compilatore. Con il compilatore G ++ per Ubuntu, quando il pedice è al di fuori dell'intervallo, il valore predefinito o qualche altro valore viene restituito o inteso essere lì nella cella. Ciò accade solo quando il vettore è già definito con alcuni elementi. Con il compilatore G ++, quando il vettore viene dichiarato senza alcun elemento e viene fatto un tentativo di accedere a una posizione di memoria correlata (senza alcun elemento al suo interno), usando qualsiasi intero del pedice (anche 0), il compilatore G ++ emette l'errore: " Guasto di segmentazione (scaricato core) ".

Prima di continuare a leggere, è necessario ricordare quanto segue: Un pedice è l'indice tra parentesi quadrate per il nome vettoriale. Questo indice viene utilizzato per fare riferimento all'elemento del vettore. Ogni indice si riferisce a un particolare elemento (valore). Il conteggio dell'indice inizia da 0 e termina a vettorizza - 1. Quindi, se un vettore ha 10 elementi, il primo elemento è all'indice 0 e il decimo elemento è all'indice 9. Utilizzo dell'indice 10 sul vettore per leggere o modificare il valore di un elemento nell'indice 10, che non esiste, dovrebbe produrre un messaggio di errore fuori portata. Tuttavia, con il compilatore G ++, purché sia ​​stato definito un vettore (memoria allocata per gli elementi, anche se sono elementi predefiniti), quando viene utilizzato un indice al di fuori dell'intervallo, il valore predefinito del tipo di elemento vettoriale o altri il valore del tipo viene restituito (o è lì per essere modificato).

Illustrazione fuori portata

Considera la seguente tabella:

UN B C D E F G H IO J
-2 -1 0 1 2 3 4 5 6 7 8 9 10 11

La prima riga mostra come sono state fatte dieci allocazioni di memoria per 10 caratteri. Sotto i caratteri nella tabella, nella seconda riga, sono gli abbonamenti corretti (indici). Utilizzando il pedice -1, -2, -3, ecc., dovrebbe comportare un errore fuori portata emesso. Utilizzando il pedice 10, 11, 12, ecc., dovrebbe anche comportare un errore fuori portata emesso.

Questo articolo illustra situazioni in cui vengono emessi errori fuori portata. Il compilatore utilizzato per i campioni di codice in questo articolo è il compilatore G ++ per Ubuntu. Non dimenticare di includere la libreria vettoriale nel programma, per qualsiasi compilatore.

Errore fuori portata per vettore definito

Un vettore definito è uno per cui la memoria è stata assegnata per gli elementi iniziali. I valori possono essere valori predefiniti o pratici per il tipo di elemento vettoriale. Un vettore dichiarato senza alcuna forma di inizializzazione non è un vettore definito. Per un tale vettore, non esiste un'allocazione di memoria per nessun elemento vettoriale. Un tale vettore è vuoto.

Compilatore G ++ per Ubuntu

Supponiamo che ci siano dieci elementi in un vettore; Un errore non insolito commesso da persone inesperte nella programmazione, è accedere al decimo elemento con il pedice di 10. Dovrebbe essere accessibile con il pedice di 9, poiché il conteggio dell'indice inizia da 0. Prendi in considerazione il seguente programma con 10 elementi nel vettore e accede al decimo elemento con l'indice di 10:

#includere
#includere
Utilizzo dello spazio dei nomi std;
int main ()

vectorvtr = 'a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'j';
char ch = vtr [10]; // Dichiarazione di errore
cout<restituzione 0;

Questo programma con il compilatore G ++ per Ubuntu fornisce un output di ", che è un carattere di nulla (niente spazio). Un personaggio di nulla è il carattere predefinito per i personaggi in C++. Non esiste undicesimo termine per questo vettore. Quindi, la seconda istruzione è un'istruzione di errore che non viene rilevata dal compilatore G ++. Con il compilatore G ++, non viene ancora rilevato in fase di esecuzione e il programma funziona erroneamente.

Alcuni altri compilatori

Quando il programma di cui sopra viene utilizzato con alcuni altri compilatori, l'istruzione di errore viene rilevata in fase di esecuzione e viene lanciata un'eccezione con un messaggio di errore emesso all'output. Tuttavia, l'errore non è ancora rilevato al momento della compilazione.

Considera la seguente dichiarazione:

vettore VTR (10);

Questa potrebbe non sembrare una definizione, ma è una definizione. Ci sono dieci posizioni di memoria per i dieci elementi vettoriali con il valore del carattere predefinito.

Errore fuori portata per vettore indefinito

Un vettore dichiarato senza alcuna forma di inizializzazione non è un vettore definito. Per un tale vettore, non esiste un'allocazione per alcun elemento vettoriale. Un tale vettore è vuoto.

Compilatore G ++ per Ubuntu

Quando un vettore dichiarato non ha inizializzazione (o non ha valori predefiniti), l'uso del sottoscrizione non è applicabile al vettore nell'accesso a qualsiasi elemento del vettore in quanto non è. Anche l'indice zero non può essere utilizzato per accedere al primo elemento, che non è presente. Nel seguente programma, viene fatto un tentativo di accedere al primo elemento, che non è presente:

#includere
#includere
Utilizzo dello spazio dei nomi std;
int main ()

vectorvtr;
char ch = vtr [0]; // Dichiarazione di errore
cout<restituzione 0;

La prima istruzione nella funzione principale dichiara un vettore senza alcuna posizione di memoria per nessuno dei suoi elementi. Questa affermazione non è una definizione. La seconda istruzione tenta di leggere il valore all'indice 0. Questa è un'istruzione di errore perché il vettore non ha un elemento e quindi nessun elemento è presente a nessun indice zero.

Con il compilatore G ++, il programma si compila correttamente, ma in fase di esecuzione, quando viene raggiunta la seconda istruzione nella funzione principale, il programma si interrompe e viene emesso il seguente messaggio di errore:

Guasto di segmentazione (core scaricato)

Alcuni altri compilatori

L'esecuzione del programma di cui sopra in altri compilatori e notare i loro corrispondenti messaggi di errore viene lasciato come esercizio per il lettore.

Conclusione

Sottoscrizione vettoriale L'errore fuori portata si verifica quando viene fatto un tentativo di accedere a un elemento vettoria. L'errore fuori portata non è sempre lo stesso dell'errore di segmentazione (scaricato core).