Як ініціалізувати масив до 0 у C?


170

Мені потрібен великий нульовий масив у С як глобальний. Чи можливо це зробити, окрім набору тексту

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

?


26
char ZEROARRAY [1024] = {0};

3
Якщо вам коли-небудь потрібно буде виділити пам'ять на купі, ви також можете використовувати calloc (). Наприклад, char * zeroarray = calloc (1024, sizoef (* zeroarray)); .
Андрій Чобану

2
NB calloc чудово підходить для charтощо, але якщо ви хочете масив покажчиків, слід встановити їх явно NULL, немає (абсурдно!) Жодної гарантії, що NULL представлена ​​як нульові байти. Це навіть незважаючи на те, що буквально 0неявно представляє нульовий покажчик.
Адріан Ратнапала

Можливий дублікат способу ініціалізації масиву в C
AechoLiu

Відповіді:


284

Глобальні та статичні змінні автоматично ініціюються до нуля. Якщо у вас просто

char ZEROARRAY[1024];

в глобальному масштабі це будуть всі нулі під час виконання. Але насправді є скорочений синтаксис, якщо у вас був локальний масив. Якщо масив частково ініціалізується, елементи, які не ініціалізовані, отримують значення 0 відповідного типу. Ви можете написати:

char ZEROARRAY[1024] = {0};

Компілятор заповнив неписані записи нулями. Крім того, ви можете використовувати memsetініціалізацію масиву при запуску програми:

memset(ZEROARRAY, 0, 1024);

Це було б корисно, якби ви змінили його і хотіли повернути його на всі нулі.


2
{0}; працює чудово, C99 [$ 6.7.8 / 21] Якщо в списку, включеному дужками, є менше ініціалізаторів, ніж елементів або членів сукупності, або менше символів у рядковому літералі, що використовується для ініціалізації масиву відомого розміру, ніж є елементів у масиві, решта сукупності повинна бути ініціалізована неявно такою ж, як об’єкти, які мають статичну тривалість зберігання
Саша Зезулінський,

Будь ласка, зверніться до: Ініціалізований 0 не є character. це а integer.
Yonggoo Noh

1
{}Обговорення: stackoverflow.com/questions/17589533 / ... memset не очевидно , правильно: я думаю , що це працює тільки для 0: stackoverflow.com/questions/11138188 / ...
Чіро Сантіллі郝海东冠状病六四事件法轮功

1
Якщо це масив структур та використання -Werror=missing-bracesв gcc, його потрібно ініціалізувати {{0}}. Якщо перший елемент структури - це інша структура, {{{0}}}і так далі. Дивіться stackoverflow.com/questions/5434865/…
Tor Klingberg

1
Сьогодні я зіткнувся з дивним ... int arr[256]={1,2,7,{0}};... який привів мене сюди. Навіть не знав, що це часткове занулення було річчю, поки я його не бачив.
Ніл

32

Якщо ви хочете ініціалізувати масив до значень, відмінних від 0, gccви можете зробити:

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

Це розширення GNU призначених ініціалізаторів C99 . У старих GCC вам може знадобитися використовувати -std=gnu99для складання коду.


14
Позначені ініціалізатори є стандартними в C99. Використання ...для позначення діапазону є специфічним для gcc розширенням.
Кіт Томпсон

1
Це не C99 призначений ініціалізатор, це GCC конкретного діапазону ініціалізатор . Навіщо звертатися до посібника GCC замість стандарту C99?
Крейг Барнс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.