Inizializzazione di stringhe con e senza terminatore finale esplicito

Inizializzazione di stringhe con e senza terminatore finale esplicito

Poiché hai già dichiarato le dimensioni, le due dichiarazioni sono esattamente uguali. Tuttavia, se non specifichi le dimensioni, puoi vedere che la prima dichiarazione crea una stringa più grande:

char a[] = "a\0";
char b[] = "a";

printf("%i %i\n", sizeof(a), sizeof(b));

stampe

3 2

Questo perché a termina con due nulli (quello esplicito e quello implicito) mentre b termina solo con quello implicito.


Bene, supponendo che i due casi siano i seguenti (per evitare errori del compilatore):

char str1[32] = "\0";
char str2[32] = "";

Come le persone hanno affermato, str1 viene inizializzato con due caratteri nulli:

char str1[32] = {'\0','\0'};
char str2[32] = {'\0'};

Tuttavia, secondo lo standard C e C++, se parte di una matrice viene inizializzata, gli elementi rimanenti della matrice vengono inizializzati per impostazione predefinita. Per un array di caratteri, i caratteri rimanenti sono tutti inizializzati da zero (cioè caratteri nulli), quindi gli array sono veramente inizializzato come:

char str1[32] = {'\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0'};
char str2[32] = {'\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0',
                 '\0','\0','\0','\0','\0','\0','\0','\0'};

Quindi, alla fine, non c'è davvero alcuna differenza tra i due.


Come altri hanno sottolineato, "" implica un carattere '\0' di terminazione, quindi "\0" inizializza effettivamente l'array con due caratteri nulli.

Alcuni altri risponditori hanno insinuato che questo è "lo stesso", ma non è del tutto corretto. Potrebbe non esserci alcuna differenza pratica, purché l'unico modo in cui viene utilizzato l'array è fare riferimento ad esso come una stringa C che inizia con il primo carattere. Ma nota che effettivamente risultano in due diverse inizializzazioni della memoria, in particolare differiscono se Str[1] è decisamente zero o non è inizializzato (e potrebbe essere qualsiasi cosa, a seconda del compilatore, del sistema operativo e di altri fattori casuali). Ci sono alcuni usi dell'array (forse non utili, ma comunque) che avrebbero comportamenti diversi.