Как да инициализираме всички членове на масив на една и съща стойност?

Имам голям масив на C (не на C++, ако това има значение). Искам да инициализирам всички членове на една и съща стойност. Мога да се закълна, че някога знаех прост начин да направя това. Бих могъл да използвам memset() в моя случай, но няма ли начин да го направя, който да е вграден в синтаксиса на C?

Решение

Освен ако тази стойност не е 0 (в такъв случай можете да пропуснете част от инициализатора и съответните елементи ще бъдат инициализирани на 0), няма лесен начин.

Все пак не пренебрегвайте очевидното решение:

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

Елементите с липсващи стойности ще бъдат инициализирани на 0:

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

Така че това ще инициализира всички елементи на 0:

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

В C++ празен инициализационен списък също ще инициализира всеки елемент на 0. Това е не е позволено при C:

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

Не забравяйте, че обектите със статична продължителност на съхранение ще се инициализират на 0, ако няма е посочен инициализатор:

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

И че "0" не означава непременно "all-bits-zero", така че използването на горното е по-добро и по-преносимо от memset(). (Стойностите с плаваща запетая ще бъдат инициализирани на +0, указатели на нулева стойност и т.н.)

Коментари (17)

Можете да използвате целия статичен инициализатор, както е описано по-горе, но това може да се окаже истинска неприятност, когато размерът на масива ви се промени (когато масивът ви се уголеми, ако не добавите съответните допълнителни инициализатори, ще получите боклук).

memset ви дава удар по време на изпълнение за извършването на работата, но никой удар по размера на кода, направен правилно, не е имунизиран срещу промени в размера на масива. Бих използвал това решение в почти всички случаи, когато масивът е по-голям от, да речем, няколко десетки елемента.

Ако беше наистина важно масивът да бъде статично деклариран, щях да напиша програма, която да напише програмата вместо мен и да я направи част от процеса на изграждане.

Коментари (1)

За инициализиране на 'нормални' типове данни (като масиви int) можете да използвате записа в скоби, но той ще занули стойностите след последната, ако в масива все още има място:

// put values 1-8, then two zeroes
int list[10] = {1,2,3,4,5,6,7,8};
Коментари (0)