L’aggiunta di array di caratteri usando strcat non funziona

Qualcuno può dirmi cosa c’è di sbagliato in questo codice ???

char sms[] = "gr8"; strcat (sms, " & :)"); 

sms è una matrice di dimensioni 4 1 . E stai aggiungendo più caratteri letterali, che vanno al di fuori dell’array, dato che l’array può contenere fino a 4 caratteri che sono già occupati da g, r, 8, \0 .

1. A proposito, perché esattamente 4? Risposta: perché alla fine c’è un carattere null!

Se si menziona la dimensione della matrice come mostrato di seguito, il codice è valido e ben definito.

 char sms[10] = "gr8"; //ensure that size of the array is 10 //so it can be appended few chars later. strcat (sms, " & :)"); 

Ma allora C ++ ti offre una soluzione migliore: usa std::string come:

 #include  //must std::string sms = "gr8"; sms += " & :)"; //string concatenation - easy and cute! 

Sì, non c’è spazio per i personaggi extra. sms[] assegna solo spazio sufficiente per memorizzare la stringa con cui è inizializzata.

Usando C ++, una soluzione molto migliore è:

 std::string sms = "gr8"; sms += " & :)"; 

Stai copiando i dati nella memoria non allocata.

Quando si esegue questa operazione: char sms[] = "gr8"; crei un array di caratteri con 4 caratteri, “gr8” più il carattere 0 alla fine della stringa.

Quindi si tenta di copiare caratteri aggiuntivi nell’array con la chiamata strcat , oltre la fine dell’array. Questo porta a comportamenti non definiti, il che significa che si verificherà qualcosa di imprevedibile (il programma potrebbe bloccarsi o potresti vedere un output strano).

Per risolvere questo problema, assicurati che l’array su cui stai copiando i caratteri sia abbastanza grande da contenere tutti i caratteri e non dimenticare il carattere 0 alla fine.

In C, gli array non crescono automaticamente.

sms ha una lunghezza specifica (4, in questo caso – tre lettere e il NULL di chiusura). Quando chiamate strcat , state cercando di aggiungere caratteri a quell’array oltre la sua lunghezza.

Questo comportamento non è definito e interromperà il tuo programma.

Se invece avessi assegnato un array con una dimensione abbastanza grande per contenere entrambe le stringhe, avresti ragione:

 char sms[9] = "gr8"; strcat (sms, " & :)"); 

C ++ ha (sostanzialmente) le stesse restrizioni sugli array che C fa. Tuttavia, fornisce servizi di livello superiore che lo rendono così non devi occuparti di array molto spesso, come std::string :

 #include  // ... std::string sms = "gr8"; sms += " & :)"; 

Il motivo per cui questo è più bello è che non devi sapere in anticipo esattamente per quanto tempo sarà la tua stringa. C ++ farà crescere la memoria sottostante in memoria per te.

Overflow del buffer per array di caratteri seguito da crash da qualche parte!

Il tuo buffer sms ha una lunghezza di soli 4 caratteri. strcat copierà altri 5 caratteri oltre la fine di esso e corromperà la pila.