2009-12-29 3 views
2

В C я прочитал, что полуинициализированные массивы будут заполнены нулями для остальных элементов (независимо от целых или массивов символов).Инициализация массивов в C

т.д .:

int arr[10] = {3}; 

arr[4] будет 0, если инициализируется и значение нежелательной, если не инициализирован.

Мой вопрос в том, будет ли выше работа для всех компиляторов C (или) это добавление нулей может произойти или не произойти в зависимости от параметра компилятора? Я работаю в студии композитора кода (IDE TI). Я хочу убедиться, что это будет работать для всех случаев и для всех компиляторов.

+0

Возможный дубликат: http://stackoverflow.com/questions/201101/how-to-initialize-an-array-in-c – Alon

ответ

2

Это должно работать независимо от того, какой компилятор вы используете.

7

Это соответствует стандарту C, и любой компилятор, следующий за стандартом C, должен это сделать. Однако не все компиляторы соответствуют стандарту 100%, и вам нужно будет проверить, действительно ли это делает это, или нет, если вы не уверены.

10

Поведение задается стандартом C. Но если вас беспокоит поведение вашего конкретного компилятора, почему бы не написать тест?

+3

Тест - хорошая идея, если вы знаете, какие компиляторы могут использоваться в коде. Если вы обеспокоены переносимостью между компиляторами для будущей работы, это может быть сложнее ;-). – semaj

5

Переменные, расположенные в сегменте данных (глобальный и единичный объем), автоматически инициализируются ко всем нулям.

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

Это стандартом C, и все компиляторы должны придерживаться его.

+2

Неверно, см. C99 6.7.8/21 «Если в списке, заключенном в скобках, меньше инициализаторов, чем есть элементы или члены, остальные будут инициализироваться неявно так же, как объекты, имеющие статическую продолжительность хранения». (что, грубо говоря, означает обнуление) – 2009-12-29 12:58:26

+0

@Pate: Спасибо за ссылку на стандарты C, Pate .. есть ли какие-либо стандартные сайты, где я могу видеть стандарты, для справок в будущем – inquisitive

+0

@Roger Да, точно. Как мой пост противоречит этому? – qrdl

1

Если вы хотите быть уверены, что ваш код будет работать со всеми компиляторами вы должны инициализировать все элементы массива просто нравится:

int arr[10] = {3,0,0,0,0,0,0,0,0,0}; 

Если число элементов вашего массива слишком высоко (100 или 10000) лучшим решением становится инициализация его динамически во время выполнения.

+2

Если вы не работаете над встроенным проектом, где кто-то возился с кодом запуска, чтобы удалить начальную инициализацию (исходя из опыта). Затем все ставки выходят за переносимость! –

+0

Может получить смысл вашего комментария. Кажется, вы согласны с моим предложением. Я прав? – gsempe

0

Это зависит от конструкции компилятора. Обычно компиляторы поддерживают его, а некоторые могут поддерживать некоторые флаги во время компиляции или другие параметры. Некоторые могут не поддерживать его. Лучше проверить с помощью соответствующей поддержки компилятора совместимость с стандартом C. Я думаю, что группа поддержки Code Composer Studio IDE (TI DSP) может дать вам точный ответ.

Karthik Balaguru

0

Язык спецификации определяет поведение по умолчанию, однако не все компиляторы реализовать определенное поведение. Хорошим примером этого является то, что Visual Studio 2008 является первой версией компилятора Microsoft C/C++, который будет вызывать конструктор по умолчанию для неинициализированных элементов в массиве, который был определенным поведением инициализации массива, поскольку по крайней мере спецификация C++ 98.

Если вы беспокоитесь о том, как ваш код будет работать на нескольких компиляторах, лучше быть в безопасности, чем извините, и явно инициализировать все значения.