#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
thenmemset
, а не justcalloc
по той же причине.
Ответ №3:
Если вам нужно какое-то конкретное поведение, то инициализируйте его таким образом. Предполагать какую-то причуду компилятора, от которой зависит правильная работа вашей программы, просто напрашивается на неприятности.
Комментарии:
1. Элементы, не указанные в инициализаторе, имеют четко определенное значение.