Mám velké pole v jazyce C (ne v C++, pokud je v tom nějaký rozdíl). Chci inicializovat všechny členy na stejnou hodnotu. Přísahal bych, že jsem kdysi znal jednoduchý způsob, jak to udělat. V mém případě bych mohl použít memset()
, ale neexistuje nějaký způsob, jak to udělat, který je zabudovaný přímo v syntaxi jazyka C?
Pokud tato hodnota není 0 (v tom případě můžete vynechat některou část inicializátoru). a příslušné prvky budou inicializovány na 0), neexistuje žádný jednoduchý způsob.
Nepřehlédněte však zřejmé řešení:
int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };
Prvky s chybějícími hodnotami budou inicializovány na 0:
int myArray[10] = { 1, 2 }; // initialize to 1,2,0,0,0...
Tím se všechny prvky inicializují na 0:
int myArray[10] = { 0 }; // all elements 0
V jazyce C++ prázdný inicializační seznam také inicializuje každý prvek na 0. V jazyce C je to nepřípustné:
int myArray[10] = {}; // all elements 0 in C++
Nezapomeňte, že objekty se statickým trváním úložiště se inicializují na 0, pokud není žádný není zadán inicializátor:
static int myArray[10]; // all elements 0
A že "0" nemusí nutně znamenat "všechny bity nula", takže použití výše uvedeného je lepší a přenositelnější než memset(). (Hodnoty s plovoucí desetinnou čárkou budou inicializovány na +0, ukazatele na nulovou hodnotu atd.)
Můžete použít celý statický inicializátor, jak je popsáno výše, ale může to být opravdu nepříjemné, když se změní velikost pole (když se pole zvětší, pokud nepřidáte příslušné inicializátory navíc, získáte smetí).
Memset vám dává zásah za běhu, protože dělá práci, ale žádný správně provedený zásah do velikosti kódu není imunní vůči změnám velikosti pole. Toto řešení bych použil téměř ve všech případech, kdy by pole bylo větší než řekněme několik desítek prvků.
Pokud by bylo opravdu důležité, aby bylo pole staticky deklarováno, napsal bych program, který by ho napsal za mě, a učinil bych ho součástí procesu sestavení.