Kako inicializirati vse člane polja na isto vrednost?

Imam veliko polje v jeziku C (in ne C++, če je to pomembno). Vse člene želim inicializirati na isto vrednost. Prisegel bi, da sem nekoč poznal preprost način za to. V mojem primeru bi lahko uporabil memset(), toda ali ne obstaja način, ki je vgrajen v sintakso C?

Rešitev

Razen če je ta vrednost 0 (v tem primeru lahko izpustite del inicializatorja in ustrezni elementi bodo inicializirani na 0), ni preprostega načina.

Vendar ne spreglejte očitne rešitve:

int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };

Elementi z manjkajočimi vrednostmi bodo inicializirani na 0:

int myArray[10] = { 1, 2 }; // initialize to 1,2,0,0,0...

Tako bodo vsi elementi inicializirani na 0:

int myArray[10] = { 0 }; // all elements 0

V C++ bo prazen inicializacijski seznam prav tako inicializiral vsak element na 0. V jeziku C je to nedovoljeno:

int myArray[10] = {}; // all elements 0 in C++

Ne pozabite, da se bodo objekti s statičnim trajanjem shranjevanja inicializirali na 0, če ni ni določen inicializator:

static int myArray[10]; // all elements 0

In da "0" ne pomeni nujno "all-bits-zero", zato je uporaba zgornjega boljša in bolj prenosljiva kot memset(). (Vrednosti s plavajočo vejico bodo inicializirane na +0, kazalci na ničelno vrednost itd.)

Komentarji (17)

Lahko uporabite celoten statični inicializator, kot je opisano zgoraj, vendar je to lahko prava nadloga, ko se spremeni velikost vašega polja (ko se polje poveča, če ne dodate ustreznih dodatnih inicializatorjev, dobite smeti).

memset vam za opravljeno delo prinese udarec v času izvajanja, vendar noben pravilno izveden poseg v velikost kode ni imun na spremembe velikosti polja. To rešitev bi uporabil v skoraj vseh primerih, ko bi bilo polje večje od, recimo, nekaj deset elementov.

Če bi bilo res pomembno, da je polje statično deklarirano, bi napisal program, ki bi ga napisal namesto mene in bi bil del postopka sestavljanja.

Komentarji (1)

Za inicializacijo 'običajnih' podatkovnih tipov (kot so polja int) lahko uporabite zapis v oklepaju, vendar se vrednosti za zadnjo vrednostjo izničijo, če je v polju še dovolj prostora:

// put values 1-8, then two zeroes
int list[10] = {1,2,3,4,5,6,7,8};
Komentarji (0)