Dichiarazione di array di caratteri e inizializzazione in C

Ero curioso di sapere perché questo non è permesso in C:

char myarray[4]; myarray = "abc"; 

E questo è permesso:

 char myarray[4] = "abc"; 

So che nel primo caso dovrei usare strcpy :

 char myarray[4]; strcpy(myarray, "abc"); 

Ma perché la dichiarazione e l’inizializzazione successiva non sono consentite e sono consentite la dichiarazione e l’inizializzazione simultanea? Si riferisce alla mapping della memoria dei programmi C?

Grazie!

Questo perché il tuo primo snippet di codice non sta eseguendo l’ inizializzazione , ma l’ assegnazione :

 char myarray[4] = "abc"; // Initialization. myarray = "abc"; // Assignment. 

E gli array non sono direttamente assegnabili in C.

Il nome myarray realtà si risolve all’indirizzo del suo primo elemento ( &myarray[0] ), che non è un lvalue , e come tale non può essere il bersaglio di un compito.

Sì, questa è una sorta di incoerenza nella lingua.

Il “=” in myarray = "abc"; è assegnamento (che non funzionerà in quanto l’array è fondamentalmente una sorta di puntatore costante), mentre in char myarray[4] = "abc"; è un’inizializzazione dell’array. Non c’è modo per “inizializzazione ritardata”.

Dovresti solo ricordare questa regola.

Penso che questi siano due casi davvero diversi. Nel primo caso la memoria viene allocata e inizializzata in fase di compilazione. Nel secondo – in runtime.

 myarray = "abc"; 

… è l’assegnazione di un puntatore su “abc” al puntatore myarray.

Questo NON sta riempiendo il buffer myarray con “abc”.

Se vuoi riempire manualmente il buffer myarray, senza strcpy (), puoi usare:

 myarray[0] = 'a', myarray[1] = 'b', myarray[2] = 'c', myarray[3] = 0; 

o

 char *ptr = myarray; *ptr++ = 'a', *ptr++ = 'b', *ptr++ = 'c', *ptr = 0; 

La tua domanda riguarda la differenza tra un puntatore e un buffer (una matrice). Spero che tu ora capisca come C indirizzi ogni tipo.

Questo è un altro esempio di C in cui la stessa syntax ha significati diversi (in luoghi diversi). Mentre si potrebbe essere in grado di sostenere che la syntax dovrebbe essere diversa per questi due casi, è quello che è. L’idea è che non è “non permesso” ma che la seconda cosa significa qualcosa di diverso (significa “assegnazione puntatore”).