Qual è la differenza tra questi due in termini di allocazione della memoria.Allocazione memoria char * e char []
char *p1 = "hello";
char p2[] = "hello";
Qual è la differenza tra questi due in termini di allocazione della memoria.Allocazione memoria char * e char []
char *p1 = "hello";
char p2[] = "hello";
Il primo crea un puntatore variabile (quattro o otto byte di archiviazione seconda della piattaforma) e memorizza una posizione di una stringa letterale lì , La seconda crea una matrice di sei caratteri (compresi zero terminatore di stringa byte) e copia il letterale lì.
Si dovrebbe ottenere un avviso del compilatore sulla prima riga poiché il valore letterale è const
.
Dove si trova esattamente la stringa letterale? È nell'heap? – blitzkriegz
Il letterale stringa è comunemente memorizzato in una regione di memoria separata sia dallo stack che dall'heap ('new' /' delete'-gestito). A seconda della piattaforma, questa regione potrebbe essere protetta dalla copia, pertanto la scrittura in esso causerà il crash del programma. –
Grazie mille per la risposta cristallina. – blitzkriegz
Il primo è un puntatore non-const per i dati const (sola lettura), il secondo è un array non-const.
Quindi char * p1 = "ciao" equivale a char const * p1 = "ciao"? – blitzkriegz
@Mahatma: sì, e questa è anche la versione più leggibile e intuitiva: 'const char * p1 =" ciao "'. –
@Mahatma: sì, ma il primo è pericoloso: senza una qualifica 'const', non esiste una protezione del compilatore contro il tentativo di modificare la stringa letterale, dando un comportamento indefinito. –
Dal momento che il primo è un puntatore non-const a const dati (sola lettura), il secondo è una matrice non-const, come diceva Paolo, è possibile scrivere:
p2[2]='A'; //changing third character - okay
Ma non puoi scrivere:
p1[2]='A';//changing third character - runtime error!
Il secondo caso è in realtà peggiore di un errore di compilazione; molto probabilmente lo accetterà il compilatore, dando un comportamento di runtime non definito. –
Non è vero: non riceverà un errore di compilazione poiché la stringa letterale non è const. Otterrà comunque UB. – Puppy
@DeadMG: corretto. :-) – Nawaz
Il primo deve essere 'const char *'! – rubenvb
'p1' richiede 4 o 8 byte (necessari per memorizzare un indirizzo di memoria) che dipende dalla piattaforma. 'p2' richiede 6 byte (= 5 byte per stringa' ciao' + 1 byte per carattere terminatore null). – RBT