Oltre a ciò che altri hanno spiegato, vorrei illustrare il primo esempio un po 'più in dettaglio. Come ha sottolineato Mohit Sehgal, in C la dichiarazione
char name[3] = "Sam";
assegna solo tre byte per la variabile name
e non mette 0 terminatore di stringa: name[0] == 'S'
, name[1] == 'a'
, name[2] == 'm'
, name[3] ==
qualunque cosa sia contenuta nell'indirizzo successivo dopo l'ultimo (terzo) byte di name
. Ad esempio, prova il seguente programma:
#include <stdio.h>
char s[3] = "abc";
char t[] = "def";
int main(int argc, char *argv[])
{
printf("s = '%s'\n", s);
printf("t = '%s'\n", t);
}
Il risultato sarà:
s = 'abcdef'
t = 'def'
perché t
è stato assegnato subito dopo s
e s
ora punta a una stringa che va avanti fino a quando viene trovato il terminatore 0 di t
.
Se si dichiara un array con inizializzazione ma senza dimensione, verrà allocato spazio sufficiente per tutti i dati nell'elenco di inizializzazione. Pertanto
#include <stdio.h>
char s[] = "abc";
char t[] = "def";
int main(int argc, char *argv[])
{
printf("s = '%s'\n", s);
printf("t = '%s'\n", t);
}
stamperà
s = 'abc'
t = 'def'
Ho testato le stesse dichiarazioni in C++
(usando il compilatore GNU), e
char name[3] = "Sam";
fornisce un errore del compilatore perché l'inizializzatore di stringhe (che C ++ considera di lunghezza 4, incluso il trailing 0) è troppo lungo per la variabile.
Quindi, sia in C che in C ++, il compilatore non assegnerà più byte di quelli specificati nella dichiarazione.