Как массив [100] = {0} задает весь массив равным 0? - программирование

Как массив [100] = {0} задает весь массив равным 0?

Как компилятор заполняет значения в char array[100] = {0};? Какая магия позади?

Я хотел знать, как инициализирует встроенный компилятор.

4b9b3361

Ответ 1

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

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

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

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

char array[100] = {};

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

Ответ 2

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

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

Ответ 4

Это зависит от того, где вы положили эту инициализацию.

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

char array[100] = {0};

int main(void)
{
...
}

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

Если ваш массив авто, то это еще одна история.

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

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

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

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

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

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

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

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

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