Это не волшебно.
поведение этого кода в C описано в разделе 6.7.8.21 из спецификации C ( проект онлайн спецификации C): для элементов, которые не имеют заданного значения, компилятор инициализирует указатели на ПУСТЫЕ и арифметические типы для обнуления (и рекурсивно применяет это к агрегатам).
поведение этого кода в C++ описано в разделе 8.5.1.7 из спецификации C++ ( проект онлайн спецификации C++): агрегат компилятора - инициализирует элементы, которые не имеют заданного значения.
кроме того, обратите внимание, что в C++ (но не C), можно использовать пустой список инициализатора, заставление компилятора агрегироваться - инициализирует все элементы массива:
char array[100] = {};
Что касается того, какой код компилятор мог бы сгенерировать, когда Вы делаете это, смотрите на этот вопрос: Странный блок от массива, с 0 инициализациями
Это зависит, куда Вы помещаете эту инициализацию.
, Если массив статичен как в
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};
...
}
тогда, это - технически тот же случай как первый.
Реализация до разработчиков компилятора.
, Если Ваш вопрос, "что произойдет с таким объявлением" - компилятор установит первый элемент массива на значение, которое Вы обеспечили (0), и все другие будут обнулены, потому что это - значение по умолчанию для опущенных элементов массива.
Если Ваш компилятор является GCC, можно также использовать следующий синтаксис:
int array[256] = {[0 ... 255] = 0};
посмотрите http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits и обратите внимание, что это определенное для компилятора функция.