In C tali dichiarazioni
char str1[5] = "abcde";
sono ammessi. In effetti ci sono 6 inizializzatori perché la stringa letterale include lo zero finale. Tuttavia nel lato sinistro viene dichiarata una matrice di caratteri che ha solo 5 elementi. Quindi non include lo zero finale.
Sembra
char str1[5] = { 'a', 'b', 'c', 'd', 'e', '\0' };
Se volete compilare questa dichiarazione in C++ il compilatore genera un errore.
Sarebbe preferibile dichiarare la matrice senza specificare esplicitamente la sua dimensione.
char str1[] = "abcde";
In questo caso avrebbe la dimensione uguale al numero di caratteri della stringa letterale tra cui la terminazione zero, che è pari a 6. E si può scrivere
printf("%s\n", str1);
In caso contrario, la funzione continua per stampare caratteri oltre l'array fino a quando non incontra il carattere zero.
Tuttavia non è un errore. È sufficiente specificare l'identificatore di formato nella chiamata di printf:
printf("%5.5s\n", str1);
e si otterrà il risultato previsto.
fonte
2015-06-23 18:53:11
Poiché la lunghezza di 'str1' è stata limitata a 5, nessun terminatore di stringa è stato memorizzato come parte dell'array. Pertanto, è stato sovraccaricato sulla stampa nella stringa successiva. Questo è un comportamento indefinito e potrebbe non accadere sempre così. –
Vedere [Nessun errore del compilatore quando il char array di dimensione fissa viene inizializzato senza spazio sufficiente per il terminatore null] (http://stackoverflow.com/q/20694796/1708801) –