Как компилятор заполняет значения в char array[100] = {0};
? Какая магия позади?
Я хотел знать, как инициализирует встроенный компилятор.
Как компилятор заполняет значения в char array[100] = {0};
? Какая магия позади?
Я хотел знать, как инициализирует встроенный компилятор.
Это не волшебство.
Поведение этого кода в C описано в разделе 6.7.8.21 спецификации C (онлайн-проект C spec): для элементы, которые не имеют заданного значения, компилятор инициализирует указатели на NULL и арифметические типы до нуля (и рекурсивно применяет это к агрегатам).
Поведение этого кода в С++ описано в разделе 8.5.1.7 спецификации С++ (онлайн-проект спецификации С++): компилятор aggregate-инициализирует элементы, которые не имеют заданного значения.
Также обратите внимание, что в С++ (но не в C) вы можете использовать пустой список инициализаторов, заставляя компилятор агрегировать-инициализировать все элементы массива:
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 и обратите внимание, что это функция для компилятора.
Это зависит от того, где вы положили эту инициализацию.
Если массив статичен, как в
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};
...
}
то это технически тот же случай, что и первый.