Assegnare un intero array con una singola istruzione

Diciamo che dichiaro e inizializzo

int a[3] = {1, 2, 3}; 

Come posso risolvere in un secondo momento l’intero array in un colpo solo? vale a dire

 a = {3, 2, 1}; 

Se il tuo compilatore c supporta i letterali composti, puoi usare memcpy :

 memcpy(a, (int[]){3, 2, 1}, sizeof a); 

Se non si prevede di applicare alcuna variabile (è ansible; C99 non è sorprendente?), (int[]) può essere sostituito da (const int[]) per inserire il letterale nella memoria statica.

composto letterale fa parte di ANSI C (C99). Dato che fa parte del linguaggio, qualsiasi compilatore che dichiara di conformarsi a C99 deve supportare questo:

memcpy (a, (int []) {3, 2, 1}, sizeof a);

gcc può essere invocato come “gcc -Wall -W -std = c99 -pedantic” per specificare lo standard.

Poiché sono passati più di 11 anni dal C99, penso che sia sicuro e probabilmente una buona idea iniziare a utilizzare le nuove funzionalità fornite dal linguaggio.

i letterali composti sono discussi nella sezione 6.5.2.5 di n869.txt

Non puoi; dovrai usare qualcosa come memset se i valori sono tutti uguali (e ogni elemento è un byte grande), o un semplice ciclo for se non sono un byte grande e se i numeri possono essere calcolati. Se i valori non possono essere calcolati in fase di esecuzione, dovrai eseguire ognuno di essi manualmente come a[x] = y; .

Il motivo per cui vengono chiamati “elenchi di inizializzatori” è perché possono essere utilizzati per inizializzare qualcosa e l’inizializzazione per definizione avviene solo una volta.

Ecco un modo non portatile di farlo che, parlando in senso stretto, può anche comportare un comportamento indefinito:

 #include  #include  int main(void) { int a[3] = { 1, 2, 3 }; printf("%d,%d,%d\n", a[0], a[1], a[2]); // assuming ints are 4-bytes-long, bytes are 8-bit-long and // the byte order in ints is from LSB to MSB (little-endian): memcpy(a, "\x03\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00", sizeof(a)); printf("%d,%d,%d\n", a[0], a[1], a[2]); return 0; } 

Produzione:

 1,2,3 3,2,1 

Non puoi farlo. Un array può essere inizializzato solo da un’espressione blindata in un inizializzatore dichiaratore. Assegni gli array.

In C89 non esisteva nemmeno una “matrice temporanea”, sebbene a partire da C99 esistessero in virtù di letterali composti (si veda la risposta di @Dave).