2011-01-13 21 views
31

Qual è la differenza tra questi due in termini di allocazione della memoria.Allocazione memoria char * e char []

char *p1 = "hello"; 
char p2[] = "hello"; 
+13

Il primo deve essere 'const char *'! – rubenvb

+0

'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

risposta

35

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.

+0

Dove si trova esattamente la stringa letterale? È nell'heap? – blitzkriegz

+10

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. –

+0

Grazie mille per la risposta cristallina. – blitzkriegz

8

Il primo è un puntatore non-const per i dati const (sola lettura), il secondo è un array non-const.

+0

Quindi char * p1 = "ciao" equivale a char const * p1 = "ciao"? – blitzkriegz

+3

@Mahatma: sì, e questa è anche la versione più leggibile e intuitiva: 'const char * p1 =" ciao "'. –

+2

@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. –

6

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! 
+1

Il secondo caso è in realtà peggiore di un errore di compilazione; molto probabilmente lo accetterà il compilatore, dando un comportamento di runtime non definito. –

+1

Non è vero: non riceverà un errore di compilazione poiché la stringa letterale non è const. Otterrà comunque UB. – Puppy

+0

@DeadMG: corretto. :-) – Nawaz