2014-04-24 13 views
10

Cosa restituiscono gli inizializzatori di array come { 'a', 'b', 'c' }? La mia comprensione è che l'uso di un inizializzatore alloca blocchi di memoria contigui e restituisce l'indirizzo al primo blocco.Cosa restituiscono gli inizializzatori di array?

Il seguente codice non funziona:

char *char_ptr_1 = { 'a', 'b', 'c', '\0' }; 

D'altra parte, questo è sembra funzionare bene:

char char_array[] = { 'a', 'b', 'c', '\0' }; 
char *char_ptr_2 = char_array; 

char_array memorizza l'indirizzo del primo blocco di memoria che spiega perché Sono in grado di assegnare il valore di char_array a chat_ptr_2. C converte il valore restituito dall'inizializzatore in qualcosa che può essere memorizzato in un puntatore?

Ho cercato online e ho trovato un paio di risposte che hanno parlato della differenza tra array e indicatori, ma non mi hanno aiutato.

+2

vuoi letterali Compound in C99. Per esempio. 'char * char_ptr_2 = (char []) {'a', 'b', 'c', '\ 0'};' – BLUEPIXY

+0

Ancora, l'elenco di inizializzazione di un letterale composto segue le stesse regole di qualsiasi altro elenco di inizializzatore. Il composto letterale assegna solo una porzione anonima di dati nello stack. Quindi è la stessa cosa che dichiarare un array e quindi assegnare un puntatore al punto su quell'array. – Lundin

+0

Si potrebbe dire 'char * char_ptr_1 =" abc ";'. Tuttavia, GCC lo segnala come deprecato senza un modificatore 'const'. Presumibilmente perché il compilatore non è obbligato a creare una matrice univoca per ogni occorrenza letterale della stringa. –

risposta

14

Inizializzatori non ritorno niente di per sé. Danno al compilatore le indicazioni su cosa mettere nell'oggetto dichiarato - in questo caso dicono al compilatore cosa mettere in elementi di un array.

Ecco perché non è possibile assegnare un inizializzatore a un puntatore: un inizializzatore di array deve essere associato a un array per dare un senso al compilatore.

Un puntatore può essere inizializzato con un'espressione di puntatore. È per questo che l'inizializzazione nella dichiarazione

char *char_ptr_2 = char_array; 

funziona: il compilatore converte char_array a un puntatore, e inizializza char_ptr_2 con esso.

4

Sono inizializzatori di array, espressioni non normali che hanno un valore. I. e., Un inizializzatore di array può solo essere utilizzato per inizializzare un array. È un po 'speciale di sintassi per un uso specifico, fine della storia.

4

In realtà non "restituisce" nulla, viene analizzato il tempo di compilazione e viene creato un array. Un puntatore deve puntare a qualcosa, non puoi assegnargli un valore diretto. Quindi prima hai bisogno dell'array, quindi il tuo puntatore può puntarlo.

6

si chiama inizializzatore di array, perché inizializza una matrice e non un puntatore.

È semplicemente sintassi C, perché l'opzione puntatore non è consentita.

Problemi correlati