Как да инициализираме всички членове на масив на една и съща стойност?
Имам голям масив на C (не на C++, ако това има значение). Искам да инициализирам всички членове на една и съща стойност. Мога да се закълна, че някога знаех прост начин да направя това. Бих могъл да използвам memset()
в моя случай, но няма ли начин да го направя, който да е вграден в синтаксиса на C?
931
3
Освен ако тази стойност не е 0 (в такъв случай можете да пропуснете част от инициализатора и съответните елементи ще бъдат инициализирани на 0), няма лесен начин.
Все пак не пренебрегвайте очевидното решение:
Елементите с липсващи стойности ще бъдат инициализирани на 0:
Така че това ще инициализира всички елементи на 0:
В C++ празен инициализационен списък също ще инициализира всеки елемент на 0. Това е не е позволено при C:
Не забравяйте, че обектите със статична продължителност на съхранение ще се инициализират на 0, ако няма е посочен инициализатор:
И че "0" не означава непременно "all-bits-zero", така че използването на горното е по-добро и по-преносимо от memset(). (Стойностите с плаваща запетая ще бъдат инициализирани на +0, указатели на нулева стойност и т.н.)
Можете да използвате целия статичен инициализатор, както е описано по-горе, но това може да се окаже истинска неприятност, когато размерът на масива ви се промени (когато масивът ви се уголеми, ако не добавите съответните допълнителни инициализатори, ще получите боклук).
memset ви дава удар по време на изпълнение за извършването на работата, но никой удар по размера на кода, направен правилно, не е имунизиран срещу промени в размера на масива. Бих използвал това решение в почти всички случаи, когато масивът е по-голям от, да речем, няколко десетки елемента.
Ако беше наистина важно масивът да бъде статично деклариран, щях да напиша програма, която да напише програмата вместо мен и да я направи част от процеса на изграждане.
За инициализиране на 'нормални' типове данни (като масиви int) можете да използвате записа в скоби, но той ще занули стойностите след последната, ако в масива все още има място: