2013-02-15 15 views
5

Perché non funziona? È possibile fare un casting creativo per farlo funzionare?Trasmetti gli inizializzatori a un puntatore

1: const char* yo1 = "abc"; 
2: const char* yo2 = { 'a', 'b', 'c', '\0' }; // <-- why can't i do this? 
3: printf("%s %s\n", yo1, yo2); 

Risultato: errore di segmentazione

Linea 2 non sta facendo quello che mi aspetto di fare.

risposta

5

si può fare:

const char* yo2 = (char [4]) { 'a', 'b', 'c', '\0' }; 

che è valido e vi ottenere quello che vuoi. Si noti che non è equivalente a:

const char* yo2 = "abc": 

Nel primo caso, quando yo2 è dichiarato al file portata: il composto array letterale ha una durata di stoccaggio statico ma quando yo2 viene dichiarato nel blocco-scope letterale composto ha durata della memorizzazione automatica.

In quest'ultimo caso, "abc" è una stringa letterale e ha durata di archiviazione statica (ambito file o ambito del blocco).

È possibile anche utilizzare un array invece di un puntatore:

const char yo2[] = { 'a', 'b', 'c', '\0' }; 

Per quanto riguarda il tuo esempio. In C:

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

non è valido e il compilatore interpreta come:

const char* yo2 = (char *) 'a'; 

Il valore di 'a' non è un valore di puntatore (un indirizzo) in modo dereferenziazione yo2 invoca un comportamento indefinito.

+0

No! Il RHS è temporaneo; non è garantito il mantenimento. – nneonneo

+0

@nneonneo è un composto letterale. Ha una durata di archiviazione automatica se dichiarato nell'ambito del blocco. Ora perché il downvote per favore? – ouah

+0

In C, sì. Ma questo diventa pericoloso non appena lo usi in C++, o lo compilo in modalità C++. Quindi non è una pratica sicura nei miei libri. – nneonneo

Problemi correlati