Perché il compilatore non rileva i limiti nell'inizializzazione della costante di stringa?

Perché il compilatore non rileva i limiti nell'inizializzazione della costante di stringa?


Ho letto questa domanda e la sua risposta in un libro. Ma non ho capito la giustificazione del libro.



int main()
{
char str[5] = "fast enough";
return 0;
}

E la risposta è stata:



Non sono riuscito a capirlo.


Qualcuno può spiegarlo per favore?


Risposte:


Nello standard C++, 8.5.2/2 Matrici di caratteri dice:



Nello standard C99, 6.7.8/2 Inizializzazione dice:



C90 6.5.7 Inizializzatori dice simile.


Tuttavia, nota che per C (sia C90 che C99) il carattere di terminazione '\0' verrà inserito nell'array se c'è spazio . Non è un errore se il terminatore non si adatta (C99 6.7.8/14:"Caratteri successivi della stringa di caratteri letterale (incluso il carattere nullo di terminazione se c'è spazio o se l'array è di dimensione sconosciuta) inizializzano gli elementi del Vettore").


D'altra parte, lo standard C++ ha un esempio che indica che un errore dovrebbe essere diagnosticato se non c'è spazio per il carattere di terminazione.


in entrambi i casi, questo dovrebbe essere diagnosticato come un errore in tutti i compilatori:


char str[5] = "fast enough";

Forse i compilatori pre-ANSI non erano così severi, ma qualsiasi compilatore ragionevolmente moderno dovrebbe diagnosticarlo.