Значения по умолчанию для массива const (когда явно заданы не все индексы)?

#c #arrays #constants

#c #массивы #константы

Вопрос:

Я искал вокруг и не нашел ответа на этот вопрос. Что я хотел бы знать, так это:

Если я объявлю a static unsigned char const ARRAY[256] = { [0] = <some_value> }; , могу ли я ожидать, что неопределенные элементы (в данном случае все, кроме элемента с индексом 0 ) будут иметь определенное значение, или они будут случайными?

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

Предложения по более подходящим типам данных или соглашениям приветствуются.

Спасибо!

Ответ №1:

Остальная часть массива будет инициализирована нулем.

Кроме того, вы можете инициализировать более одного элемента в массиве, например:

 char arr[10] = {1, 2, 3};
  

создаст и инициализирует массив arr для:

 index | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
---------------------------------------------
value | 1 | 2 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0
  

Комментарии:

1. Спасибо, теперь я могу спокойно продолжать свой путь. 🙂

Ответ №2:

Если вы хотите уточнить это и используете gnu c, всегда есть ... :

 char array[256] = {[0 ... 255] = 0, [7] = 'f',/*and so on...*/};
  

Комментарии:

1.Нет, это не всегда ... так. Это специфичное для gcc расширение, а не часть языка.

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

3. Я понимаю, что это избыточно, но это проясняет намерение. Это показывает, что вы полагаетесь на данные с нулевой инициализацией. Я использую malloc then memset , а не just calloc по той же причине.

Ответ №3:

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

Комментарии:

1. Элементы, не указанные в инициализаторе, имеют четко определенное значение.