Как массив [100] = {0} устанавливает весь массив на 0?

140
задан Bakuriu 24 April 2014 в 08:15
поделиться

4 ответа

Это не волшебно.

поведение этого кода в C описано в разделе 6.7.8.21 из спецификации C ( проект онлайн спецификации C): для элементов, которые не имеют заданного значения, компилятор инициализирует указатели на ПУСТЫЕ и арифметические типы для обнуления (и рекурсивно применяет это к агрегатам).

поведение этого кода в C++ описано в разделе 8.5.1.7 из спецификации C++ ( проект онлайн спецификации C++): агрегат компилятора - инициализирует элементы, которые не имеют заданного значения.

кроме того, обратите внимание, что в C++ (но не C), можно использовать пустой список инициализатора, заставление компилятора агрегироваться - инициализирует все элементы массива:

char array[100] = {};

Что касается того, какой код компилятор мог бы сгенерировать, когда Вы делаете это, смотрите на этот вопрос: Странный блок от массива, с 0 инициализациями

161
ответ дан Dinei 24 April 2014 в 08:15
поделиться

Это зависит, куда Вы помещаете эту инициализацию.

, Если массив статичен как в

char array[100] = {0};

int main(void)
{
...
}

тогда, это - компилятор, который резервирует 100 0 байтов в данных segement программы. В этом случае Вы, возможно, опустили инициализатор.

, Если Ваш массив является автоматическим, то это - другая история.

int foo(void)
{
char array[100] = {0};
...
}

В этом случае в каждом вызове функционального нечто у Вас будет скрытый memset.

код выше эквивалентен

int foo(void)
{ 
char array[100];

memset(array, 0, sizeof(array));
....
}

и если Вы опустите инициализатор, то Ваш массив будет содержать случайные данные (данные стека).

, Если Ваш локальный массив объявляется статичный как в [1 111]

int foo(void)
{ 
static char array[100] = {0};
...
}

тогда, это - технически тот же случай как первый.

17
ответ дан LPs 24 April 2014 в 08:15
поделиться

Реализация до разработчиков компилятора.

, Если Ваш вопрос, "что произойдет с таким объявлением" - компилятор установит первый элемент массива на значение, которое Вы обеспечили (0), и все другие будут обнулены, потому что это - значение по умолчанию для опущенных элементов массива.

35
ответ дан qrdl 24 April 2014 в 08:15
поделиться

Если Ваш компилятор является GCC, можно также использовать следующий синтаксис:

int array[256] = {[0 ... 255] = 0};

посмотрите http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits и обратите внимание, что это определенное для компилятора функция.

27
ответ дан Numeri 24 April 2014 в 08:15
поделиться