2011-10-20 17 views
10

Questa è una continuazione di un'altra question che ho.inizializzazione stringa array

Si consideri il seguente codice:

char *hi = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

non si compila con mia grande sorpresa (a quanto pare non so la sintassi C, così come ho pensato) e genera il seguente errore:

error: initializer element is not constant 

Se cambio il char * in char [] si compila bene:

char hi[] = "hello"; 

char *array1[3] = 
{ 
    hi, 
    "world", 
    "there." 
}; 

qualcuno può spiegarmi perché?

risposta

6

Nel primo esempio (char *hi = "hello";), si sta creando un puntatore non-const inizializzato per puntare alla stringa const const "hello". Questo puntatore potrebbe, in teoria, indicare qualsiasi cosa tu voglia.

Nel secondo esempio (char hi[] = "hello";) si definisce in modo specifico un array, non un puntatore, pertanto l'indirizzo a cui esso fa riferimento non è modificabile. Si noti che un array può essere pensato come un puntatore non modificabile a un blocco specifico di memoria.

Il tuo primo esempio in realtà viene compilato senza problemi in C++ (il mio compilatore, almeno).

+1

grazie. c'è un modo per usare la parola chiave const per far funzionare il primo pezzo di codice? – lang2

+1

@ lang2 Non incluso in questo ambito. Vedi questo [C FAQ] (http://c-faq.com/ansi/constasconst.html). Neanche con 'char * const hi' (puntatore costante al carattere). – cnicutar

+0

Appena aggiunto qualcosa, anche se non so se funzionerà ... la tua prima versione compila OK in C++ - Proverò con un compilatore C quando mi prendo un momento :) – icabod

Problemi correlati