2012-06-27 14 views
9

Probabilmente sono un po 'troppo scemo per cercare su google, ma ho sempre pensato che gli array di caratteri ricevessero solo null terminato da un'inizializzazione letterale (char x[]="asdf";) e mi sono un po' sorpreso quando ho visto che questo non sembra essere il caso.Tutti gli array di caratteri sono automaticamente terminati con null?

int main() 
{ 
    char x[2]; 
    printf("%d", x[2]); 
    return 0; 
} 

uscita: 0

Qualora non una matrice dichiarata come size = 2 * char effettivamente ottenere la dimensione di 2 caratteri? O sto facendo qualcosa di sbagliato qui? Voglio dire, non è raro usare un array di caratteri come un semplice array di caratteri e non come una stringa, o è?

risposta

20

Si sta accedendo a un array non inizializzato al di fuori dei suoi limiti. Quello è doppio comportamento non definito, tutto potrebbe succedere, anche ottenere 0 come output.

In risposta alla tua domanda reale: solo stringhe letterali ottenere terminazione null, e questo significa che char x[]="asdf" è un array di elementi 5.

+0

Anch'io ci ho pensato, quindi ho provato a creare array con dimensioni diverse e l'array era sempre seguito da uno 0. (lo 0 mostrato nel mio esempio non era seguito da 0, ma un array con dimensioni 1 * char nella stessa posizione era) – user1329846

+0

@ user1329846: Qualunque cosa sia memorizzata in memoria dopo che l'array termina è fino al compilatore, stai ricevendo 0 ma potresti anche ottenere qualsiasi altro numero come dice lo standard se provi a leggerlo posizione tutte le scommesse sono disattivate. Consentitemi di chiarire questo punto: anche se siete stati fortunati ad avere sempre 0 qui, il vostro codice attiva ancora il _undefined behavior_ e potrebbe fallire in qualsiasi momento. –

+0

Grazie per non usare 'può succedere di tutto, anche il tuo computer potrebbe darsi fuoco '. No, non può. E tutti questi esempi grandiosi sono semplicemente stupidi. – jn1kk

3

char matrici sono non automaticamente terminato NULL, solo stringhe letterali, ad es. char *myArr = "string literal"; e alcuni puntatori a stringa di stringa restituiti dai metodi di stringa stdlib.

C non esegue il controllo dei limiti. Quindi, una matrice dichiarata come dimensione 2*char fornisce 2 slot di memoria che è possibile utilizzare, ma si ha la libertà di camminare su tutta la memoria su entrambi i lati, leggendo e scrivendo e invocando così un comportamento indefinito. Lì potrebbero vedere i byte 0. Puoi scrivere a array[-1] e bloccare il programma. È responsabilità dell'utente tenere traccia delle dimensioni della matrice ed evitare di toccare la memoria che non è stata allocata.

È comune utilizzare un array di caratteri come un semplice array di caratteri, ad esempio, ad eccezione di una stringa C, ad esempio, per contenere qualsiasi buffer arbitrario di byte non elaborati.

0

Se t è un array di dimensione 2, quindi l'ultimo caso è t[2 - 1] = t[1] e non 2. t[2] è fuori dai limiti.

Problemi correlati