Come inizializzare l'array su 0 in C?


170

Ho bisogno di un grande array null in C come globale. C'è un modo per farlo oltre a digitare

char ZEROARRAY[1024] = {0, 0, 0, /* ... 1021 more times... */ };

?


26
char ZEROARRAY [1024] = {0};

3
Se hai mai bisogno di allocare memoria sull'heap, puoi anche usare calloc (). Ad esempio char * zeroarray = calloc (1024, sizoef (* zeroarray)); .
Andrei Ciobanu,

2
NB calloc va bene per charetc, ma se vuoi un array di puntatori, dovresti impostarli esplicitamente su NULL, non c'è (assurdamente!) Alcuna garanzia che NULL sia rappresentato come zero byte. Questo anche se il valore letterale 0rappresenta implicitamente il puntatore null.
Adrian Ratnapala,

Risposte:


284

Le variabili globali e variabili statiche vengono inizializzate automaticamente su zero. Se hai semplicemente

char ZEROARRAY[1024];

a livello globale saranno tutti zeri in fase di esecuzione. Ma in realtà non v'è una sintassi ridotta se si ha una matrice locale. Se un array è parzialmente inizializzato, gli elementi che non sono inizializzati ricevono il valore 0 del tipo appropriato. Puoi scrivere:

char ZEROARRAY[1024] = {0};

Il compilatore riempirebbe le voci non scritte con zeri. In alternativa, è possibile utilizzare memsetper inizializzare l'array all'avvio del programma:

memset(ZEROARRAY, 0, 1024);

Sarebbe utile se lo avessi modificato e volessi ripristinarlo a tutti gli zeri.


2
{0}; funziona bene, C99 [$ 6.7.8 / 21] Se ci sono meno inizializzatori in un elenco racchiuso tra parentesi graffe rispetto a elementi o membri di un aggregato, o meno caratteri in un letterale stringa usato per inizializzare un array di dimensioni conosciute rispetto a elementi nell'array, il resto dell'aggregato deve essere inizializzato implicitamente come gli oggetti che hanno una durata di memorizzazione statica
Sasha Zezulinsky

Fare riferimento a: Lo 0 inizializzato non è a character. è un integer.
Yonggoo Noh,

1
{}discussione: stackoverflow.com/questions/17589533/... memset ovviamente non è corretto: Penso che funziona solo per 0: stackoverflow.com/questions/11138188/...
Ciro Santilli郝海东冠状病六四事件法轮功

1
Se è un array di strutture, e usando -Werror=missing-bracesin gcc, deve essere inizializzato su {{0}}. Se il primo elemento struct è un'altra struttura, {{{0}}}e così via. Vedi stackoverflow.com/questions/5434865/…
Tor Klingberg il

1
Oggi ho incontrato lo strano ... int arr[256]={1,2,7,{0}};... che mi ha portato qui. Non sapevo nemmeno che questo azzeramento parziale fosse una cosa fino a quando non l'ho visto.
Neil Gatenby

32

Se desideri inizializzare l'array su valori diversi da 0, gccpuoi fare:

int array[1024] = { [ 0 ... 1023 ] = -1 };

Questa è un'estensione GNU degli inizializzatori designati C99 . Nel vecchio GCC, potrebbe essere necessario utilizzare -std=gnu99per compilare il codice.


14
Gli inizializzatori designati sono standard in C99. L'uso di ...per indicare un intervallo è un'estensione specifica di gcc.
Keith Thompson,

1
Questo non è un inizializzatore designato C99, è un inizializzatore di intervallo specifico di GCC . Perché consultare il manuale GCC anziché lo standard C99?
Craig Barnes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.