Nel linguaggio C, le stringhe sono implementate come array di caratteri terminati da un byte zero ('\0'). Esempio di dichiarazione di una stringa:
char str1[] = "hello"; // Array con 6 caratteri: {'h','e','l','l','o','\0'} char *str2 = "hello"; // Puntatore a un letterale di stringa
const).Per evitare errori:
malloc, strcpy, verifica la dimensione del buffer).\0.Esempio di corretta gestione di una stringa:
char buffer[100]; strcpy(buffer, "test"); // OK, buffer è mutabile e contiene garantito '\0'
Qual è il risultato dell'esecuzione del seguente codice e a quali errori porterà?
char *str = "hello"; str[0] = 'H'; printf("%s\n", str);
Risposta: Il programma porterà a un comportamento indefinito, molto probabilmente a un segfault, perché i letterali di stringa sono collocati in una zona di memoria di sola lettura. Non è possibile scrivere valori all'indirizzo di un letterale di stringa.
Storia Il team ha confuso i concetti di array di stringhe e puntatore a letterale. Una funzione accettava
char *output = "default";e successivamente eseguivastrcpy(output, input);, il che portava a un crash al primo avvio, perché la copia avveniva in memoria di sola lettura.
Storia Durante il lavoro di rete, il risultato dell'operazione veniva scritto in un buffer, allocato con
char *buf = NULL; strcpy(buf, data);. Questo ha portato a scrivere in memoria non inizializzata e al crash dell'applicazione.
Storia In un pacchetto di localizzazione, il team passava stringhe tra componenti, senza assicurarsi che fosse stato aggiunto un carattere
\0. Una volta, una funzione ha stampato spazzatura nella console e ha danneggiato la struttura interna della memoria.