Код (Text): void f() { int a[10] = {}; ... } Вопрос: что говорят стандарты? Должен ли массив быть инициализирован нулями или этот случай "compiler dependent" и может иметь место простое резервирование памяти на стеке?
В книгах по С++ обычно рекомендуют инициализировать члены класса, а вот про локальные переменные я что-то не слышал. И потом, все зависит от контекста процедуры, как ты собираешься с этим массивом обращаться. Если ты уверен, что все его элементы будут корректно установлены и не требуется инициализации дефолтными значениями, тогда забей на него. Если же есть сомнения, тогда инициализируй.
В массиве будет хлам (остатки предыдущих значений, хранившихся в стеке). Никто специально для тебя не будет чистить стек по выходе из процедур. Как будто винде больше время тратить не на что, кроме как на зачистку сегмента стека после выполнения процедур.
clone Стандарт вообще такой изврат не поддерживает, afaik. Инициализация - это операция, которую осуществляет компилятор на этапе компиляции, а не в рантайме. Вот пример инициализации, который будет правильно воспринят любым стандартным компилятором C/C++: Код (Text): char a[10] = {1,2,3}; Здесь a - это глабальный массив. Первые 3 байта будут проинициализированы значениями 1, 2 и 3. Остальные 7 - значением по умолчанию, которым обычно является ноль. Чтобы инициализация значением по умолчанию остальных байтов массива (или полей структуры) имело место быть, должен быть явно указан хотя бы один элемент (естественно, первый) данного массива. Поэтому {0} не равно {}. Теперь перейдём к локальным переменным: Код (Text): void f1(void){ char a[10] = {1,2,3}; /* ... */ Есть компиляторы C, которые вообще такое не переваривают и имеют на это полное право, т.к. это уже не инициализация (это будет присваивание в рантайме). Слово static исправляет этот конфликт со стандартом: Код (Text): void f1(void){ static char a[10] = {1,2,3}; /* ... */ Но такое решение не всегда приемлемо. Единственный стандартный способ подобной инициализации, как можно легко догадаться - это написать код, который будет динамически присваивать каждой ячейке соответствующее значение.
Asterix Чем в данном случае `{}' отличается от {0}? crypto Классы тут и рядом не валялись. cresta Мне лично такой вариант нравится, но см. топик и внимательно читай первый пост. Quantum AFAYK меня мало интересует (см. топик и вопрос) следующая фраза адресована всем Речь -- повторяю -- о стандартах.
clone Прочитай внимательнее мой предыдущий ответ. Хорошо, читай стандарт самостоятельно и делай выводы сам, если речь вообще о действующем стандарте ANSI C99 или C++ 98, а не о каком-то метастандарте, обьединяющем особенности популярных компиляторов. Конкретно в ISO/IEC 9899:1999 (это последний стандарт ANSI C99) можно найти следующее про инициализацию локальных массивов: aggregate значит массив или struct, automatic - это локальная переменная.
clone Про синтаксис brace-enclosed list - это в другом разделе. Чтобы понять, нужно прочитать книжку полностью. Бесплатный драфт называется n1124.pdf.
н-да понаписали... итак: есть знак = и это объявление с явной инициализацией а дальше уже зависит от языка... это не валидный ISO/IEC 9899:1999 С см синтаксис §6.7.8 initializer: assignment-expression { initializer-list } { initializer-list , } и не скомпилится это валидный ISO/IEC 14882:2003 С++ см синтаксис 8.5 initializer: = initializer-clause ( expression-list ) initializer-clause: assignment-expression { initializer-list ,opt } { } // вот оно и массив будет инициализирован дефолтным значением для типа int то есть 0 инициализация будет в рантайме! а что там пишут про инициализацию компилятором (на самом деле линкером) так это относится с объектам статического класса памяти...
fr0b-p Инициализация обычных локальных агрегатов vs. статических локальных или вообще глобальных, стандартом рассматривается в разных секциях. Я привёл цитату именно по локальным не статическим агрегатам.
Я на свой вопрос получил более, чем исчерпывающий ответ, и -- если нет желающих пофлеймить на сопряжённые темы -- топик можно закрывать.