2009-07-11 12 views
8

Ho pensato che si potesse dichiarare un array, quindi in seguito lo si può avviare.C Dichiarazione dell'array di caratteri *

Come così

char* myArray[3]; 


//CODE INBETWEEN 

myArray[3] = { 

      "blah", 
      "blah", 
      "blah"}; 
+1

Si sta dichiarando un array di puntatori di caratteri. Ogni puntatore dovrebbe puntare a un buffer dinamico o statico prima di poter usare strcpy() o altre operazioni con le stringhe per modificare il contenuto. – stanigator

+0

Quindi devo inizializzare e dichiarare allo stesso tempo?> –

risposta

18

No, è possibile inizializzare solo una matrice prima volta che si dichiara. La ragione è che gli array non sono lvalue modificabili.

Nel tuo caso:

char *array[] = {"blah", "blah", "blah"}; 

Non è necessario specificare la dimensione, ma è possibile, se si desidera. Tuttavia, la dimensione non può essere inferiore a 3 in questo caso. Inoltre, le tre stringhe sono scritte in memoria di sola lettura, quindi qualcosa come array[1][2] = 'c' per cambiare il 2 ° "blah" in "blch" normalmente darà come risultato un segfault.

+2

Più precisamente, gli array nella maggior parte dei contesti valutano i rvalues, non i lvalue e l'assegnazione a un valore rvalore non è consentita. – caf

+0

In realtà, la tua spiegazione è probabilmente più corretta. Modificato il mio post. –

0

Hai pensato male. L'inizializzazione è possibile solo alla dichiarazione. Successivamente, puoi solo assegnare valori individuali.

0

È un'espressione di inizializzazione. Non può avere quel codice in mezzo, deve essere usato sulla linea con la dichiarazione.

2

Come altri hanno già detto, è possibile utilizzare solo gli inizializzatori quando la variabile viene dichiarata. Il modo più semplice per fare ciò che vuoi è:

char *myArray[3]; 

/* CODE INBETWEEN */ 

{ 
    static const char *tmp[3] = { 
      "blah", 
      "blah", 
      "blah" }; 
    memcpy(myArray, tmp, sizeof myArray); 
} 
1

Sì, è possibile dichiarare un array e poi inizializzarlo in seguito.
Tuttavia, qui c'è un'eccezione.
Si sta dichiarando un array di puntatori di caratteri (che ha funzionato correttamente).
E, quindi siete che istanziate stringhe costanti per assegnarle all'array.

Ecco dove inizia il problema.
Le stringhe costanti sono solo primitive del compilatore che non ottengono alcuna posizione di memoria indirizzabile nel modo in cui sono state utilizzate. Possono essere assegnati direttamente al momento di inizializzazione dell'array (come mostrato da Mike); questo istruirà il compilatore ad allocarli come costanti disponibili in fase di esecuzione e consentire un'inizializzazione quando viene avviato l'ambito di myArray.


Cosa avete provato avrebbe funzionato bene con

int numberArray[3]; 
// code here 
numberArray[0] = 1; 
numberArray[1] = 2; 
numberArray[2] = 3; 

Aiuta a notare che un puntatore a carattere e un'istanza di stringa sono due entità diverse; il primo può puntare al secondo.

+0

Nel tuo esempio non stai inizializzando i valori. Stai semplicemente impostando il valore. Un ottimizzatore può trasformare ciò che hai scritto in fase di inizializzazione, ma non c'è alcuna garanzia. – Jared

+0

@Jared, prenderò il tuo voto negativo e commenterò nello spirito del significato esatto di "inizializzazione".Tuttavia, non penso che la domanda significhi la parola in questo senso. – nik