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