Как инициализировать массив до 0 в C?


170

Мне нужен большой нулевой массив в C как глобальный. Есть ли способ сделать это, кроме ввода

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 хорош для charetc, но если вам нужен массив указателей, вы должны явно установить их в NULL, (абсурдно!) Нет никакой гарантии, что NULL будет представлен нулевыми байтами. Это несмотря на то, что литерал 0неявно представляет нулевой указатель.
Адриан Ратнапала

Ответы:


284

Глобальные переменные и статические переменные автоматически обнуляются. Если у вас есть просто

char ZEROARRAY[1024];

в глобальном масштабе это будут все нули во время выполнения. Но на самом деле есть это синтаксис стенографии , если у вас есть локальный массив. Если массив частично инициализирован, элементы, которые не инициализированы, получают значение 0 соответствующего типа. Вы могли бы написать:

char ZEROARRAY[1024] = {0};

Компилятор будет заполнять неписанные записи нулями. В качестве альтернативы вы можете использовать memsetдля инициализации массива при запуске программы:

memset(ZEROARRAY, 0, 1024);

Это было бы полезно, если бы вы изменили его и хотели сбросить его обратно на все нули.


2
{0}; отлично работает, C99 [$ 6.7.8 / 21] Если в заключенном в скобки списке меньше инициализаторов, чем элементов или членов агрегата, или меньше символов в строковом литерале, используемом для инициализации массива известного размера, чем элементы в массиве, остальная часть совокупности должна быть инициализирована неявно так же, как объекты, которые имеют статическую длительность хранения
Саша Зезулинский

Пожалуйста, обратитесь к: инициализированный 0 не является character. это integer.
Ёнгу Но

1
{}обсуждение: stackoverflow.com/questions/17589533/… memset не совсем корректно: я думаю, что это работает только для 0: stackoverflow.com/questions/11138188/…
Ciro Santilli 10 冠状 病 六四 事件 法轮功

1
Если это массив структур и используется -Werror=missing-bracesв gcc, он должен быть инициализирован как {{0}}. Если первый элемент структуры является другой структурой, то {{{0}}}и так далее. См. Stackoverflow.com/questions/5434865/…
Тор Клингберг

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.