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”).