2010-05-23 10 views
5

Diciamo che ho una matrice comeCome inizializzare un array con qualcosa in C senza un loop?

int arr[10][10]; 

Ora voglio per inizializzare tutti gli elementi di questo array a 0. Come posso fare questo senza loop o specificare ogni elemento?

prega di notare che questa domanda se per C

+0

Duplicato: http://stackoverflow.com/questions/201101/how-to-initialize-an-array-in-c – ptomato

risposta

11

La soluzione rapida-n-sporco:

int arr[10][10] = { 0 }; 

Se si inizializza qualsiasi elemento dell'array, C sarà di default-inizializzare ogni elemento che non si specifica in modo esplicito. Quindi il codice precedente inizializza il primo elemento a zero e C imposta tutti gli altri elementi a zero.

+1

Inizializza tutti gli elementi a 0? Perché dici che è sporco? – Laz

+9

Giusto per chiarire: non "segue l'esempio", lo * costringe * a zero. Se hai scritto '= {1};' avrebbe messo il primo valore come 1, e il resto sarebbe ancora zero. –

+1

Dico quick-n-dirty perché, anche se è logicamente corretto e garantito per funzionare, può confondere i maintainer. Lo considero un collegamento, ed evito di usarlo a meno che l'array o la struttura dati siano troppo grandi per inizializzare convenientemente ogni elemento. –

1
int myArray[2][2] = {}; 

Non è necessario scrivere anche lo zero in modo esplicito.

+0

Questo è il tipo di array errato e uno "zero" dall'aspetto strano. –

+0

Sì, mi dispiace per quello. Aggiornato. –

+0

Penso che in C devi scrivere lo zero (le parentesi vuote sono, tuttavia, C++ valido). – avakar

4
int arr[10][10] = {0}; // only in the case of 0 
5

Oltre la sintassi di inizializzazione, si può sempre memset(arr, 0, sizeof(int)*10*10)

+0

Si noti che questo richiede ancora tempo O (N) per N elementi. D'altra parte è probabilmente un O (N) più veloce di quello che si codifica a mano (o almeno non più lento). – dmckee

+0

memset utilizza un ciclo, quindi questo non risponde alla domanda. – SoapBox

+0

'memset' potrebbe anche essere sbagliato per il puntatore o gli array a virgola mobile. –

3

Sei fortunato: con 0, è possibile.

memset(arr, 0, 10 * 10 * sizeof(int)); 

Non si può fare questo con un valore diverso da 0, perché memset opere in byte, non sul int s. Ma unè tutto 0 byte avrà sempre il valore 0.

+1

Si potrebbe anche farlo con ~ 0 – geocar

+1

... inizializzando tutti gli elementi a -1. Buon punto, non ci avevo pensato. – Thomas

+0

Puoi farlo con qualsiasi altro valore che, come byte, è costituito dallo stesso valore in ogni byte. 'n * (UINT_MAX + 1ULL)/255' è la famiglia di tali valori (' n' = 0,1, ..., 'UCHAR_MAX'). –

0

int arr [10] [10] = {0};

Problemi correlati