ProgrammazioneSviluppatore C

Come viene implementata la gestione delle stringhe in C? Spiega la differenza tra un array di caratteri e un puntatore a stringa. Come evitare errori nella gestione delle stringhe?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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
  • Array di caratteri: Riserva memoria per ogni elemento, incluso lo zero finale. L'array può essere modificato (se non è const).
  • Puntatore a stringa: Può puntare a un letterale di stringa (che non può essere modificato) o a una porzione di memoria allocata. Il letterale di stringa è solitamente collocato nella sezione di memoria di sola lettura.

Per evitare errori:

  • Gestisci correttamente la memoria (usa malloc, strcpy, verifica la dimensione del buffer).
  • Per modificare le stringhe, non utilizzare i letterali di stringa.
  • Verifica che tutte le stringhe siano terminate con \0.

Esempio di corretta gestione di una stringa:

char buffer[100]; strcpy(buffer, "test"); // OK, buffer è mutabile e contiene garantito '\0'

Domanda trabocchetto

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.

Esempi di errori reali dovuti all'ignoranza delle sottigliezze della materia


Storia Il team ha confuso i concetti di array di stringhe e puntatore a letterale. Una funzione accettava char *output = "default"; e successivamente eseguiva strcpy(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.