Jak zainicjować tablicę na 0 w C?

170

Potrzebuję dużej tablicy null w C jako globalnej. Czy jest jakiś sposób na zrobienie tego poza wpisywaniem

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

?

Claudiu
źródło
26
char ZEROARRAY [1024] = {0};
3
Jeśli kiedykolwiek będziesz musiał przydzielić pamięć na stercie, możesz również użyć metody calloc (). Na przykład char * zeroarray = calloc (1024, sizoef (* zeroarray)); .
Andrei Ciobanu
2
NB calloc jest w porządku dla charetc, ale jeśli chcesz mieć tablicę wskaźników, powinieneś ustawić je jawnie na NULL, nie ma (absurdalnie!) Żadnej gwarancji, że NULL jest reprezentowane jako bajty zerowe. Dzieje się tak, mimo że literał 0niejawnie reprezentuje wskaźnik null.
Adrian Ratnapala
Możliwy duplikat Jak zainicjować tablicę w C
AechoLiu

Odpowiedzi:

284

Zmienne globalne i zmienne statyczne są automatycznie inicjowane do zera. Jeśli masz po prostu

char ZEROARRAY[1024];

w zakresie globalnym będą to same zera w czasie wykonywania. Ale faktycznie nie jest składnia skrótowym jeśli miał lokalną tablicę. Jeśli tablica jest częściowo zainicjowana, elementy, które nie zostały zainicjowane, otrzymują wartość 0 odpowiedniego typu. Możesz napisać:

char ZEROARRAY[1024] = {0};

Kompilator wypełni niepisane wpisy zerami. Alternatywnie możesz użyć memsetdo zainicjowania tablicy podczas uruchamiania programu:

memset(ZEROARRAY, 0, 1024);

Byłoby to przydatne, gdybyś go zmienił i chciał zresetować z powrotem do wszystkich zer.

John Kugelman
źródło
2
{0}; działa dobrze, C99 [6,7,8 USD / 21] Jeśli jest mniej inicjatorów na liście w nawiasach klamrowych niż elementów lub członków agregatu, lub mniej znaków w literale ciągu używanym do inicjalizacji tablicy o znanym rozmiarze niż jest elementów w tablicy, pozostała część kruszywa powinny być inicjowane domyślnie taka sama jak przedmioty, które mają statyczny czas przechowywania
Sasha Zezulinsky
Zobacz: Zainicjowane 0 nie jest plikiem character. to jest integer.
Yonggoo Noh
1
{}dyskusja: stackoverflow.com/questions/17589533/… memset nie jest oczywiście poprawna: myślę, że działa tylko dla 0: stackoverflow.com/questions/11138188/ ...
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
Jeśli jest to tablica struktur i używa się -Werror=missing-bracesw gcc, musi zostać zainicjowana {{0}}. Jeśli pierwszy element struktury jest inną strukturą, to {{{0}}}i tak dalej. Zobacz stackoverflow.com/questions/5434865/…
Tor Klingberg,
1
Dzisiaj spotkałem dziwnego ... int arr[256]={1,2,7,{0}};... który mnie tu przywiózł. Nie wiedziałem nawet, że to częściowe zerowanie było ważne, dopóki go nie zobaczyłem.
Neil Gatenby,
32

Jeśli chcesz zainicjować tablicę wartościami innymi niż 0, gccmożesz zrobić:

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

To jest rozszerzenie GNU C99 Designated Initializers . W starszym GCC może być konieczne użycie -std=gnu99do kompilacji kodu.

Deqing
źródło
14
Wyznaczone inicjatory są standardem w C99. Użycie ...do oznaczania zakresu jest rozszerzeniem specyficznym dla gcc.
Keith Thompson 8-13
1
To nie jest inicjator wyznaczony przez C99, jest to inicjator zakresu specyficzny dla GCC . Po co sięgać do instrukcji GCC zamiast standardu C99?
Craig Barnes