C Language Stringhe letterali


Esempio

I valori letterali delle stringhe rappresentano array di char statici a terminazione nulla di char . Poiché hanno una durata di archiviazione statica, una stringa letterale o un puntatore allo stesso array sottostante può essere tranquillamente utilizzata in diversi modi che non è possibile per un puntatore a un array automatico. Ad esempio, restituire una stringa letterale da una funzione ha un comportamento ben definito:

const char *get_hello() {
    return "Hello, World!";  /* safe */
}

Per ragioni storiche, gli elementi dell'array corrispondenti a una stringa letterale non sono formalmente const . Tuttavia, qualsiasi tentativo di modificarli ha un comportamento indefinito . In genere, un programma che tenta di modificare la matrice corrispondente a una stringa letterale si bloccherà o funzionerà in altro modo.

char *foo = "hello";
foo[0] = 'y';  /* Undefined behavior - BAD! */

Laddove un puntatore punta a una stringa letterale - o dove a volte può farlo - è consigliabile dichiarare il const referente di quel puntatore per evitare di coinvolgere accidentalmente un comportamento non definito.

const char *foo = "hello";
/* GOOD: can't modify the string pointed to by foo */

D'altra parte, un puntatore verso o nell'array sottostante di un letterale stringa non è di per sé intrinsecamente speciale; il suo valore può essere liberamente modificato per indicare qualcos'altro:

char *foo = "hello";
foo = "World!"; /* OK - we're just changing what foo points to */

Inoltre, sebbene gli inizializzatori per i char di tipo char possano avere la stessa forma dei letterali di stringa, l'uso di tale inizializzatore non conferisce le caratteristiche di una stringa letterale sull'array inizializzato. L'inizializzatore indica semplicemente la lunghezza e il contenuto iniziale dell'array. In particolare, gli elementi sono modificabili se non dichiarati esplicitamente const :

char foo[] = "hello";
foo[0] = 'y';  /* OK! */