Обнуление необычного массива
У меня есть немного кода C, воспроизведенного ниже. Насколько я понимаю, он устанавливает определенные биты массива BootPML4 на определенное значение. Может кто-нибудь объяснить, пожалуйста, как BootPML4
массив ниже заполнен? Кроме того, как я могу гарантировать, что неиспользуемые значения в массиве обнуляются, при этом оставаясь неизменными две настройки ниже?
typedef uint64_t pml4_entry_t;
#define PML4_PROT (INTEL_PTE_VALID | INTEL_PTE_WRITE)
pml4_entry_t BootPML4[PTE_PER_PAGE] __attribute__((section("__HIB, __bootPT"))) = {
[0] = ((uint64_t)(PAGE_SIZE) | PML4_PROT),
[KERNEL_PML4_INDEX] = ((uint64_t)(PAGE_SIZE) | PML4_PROT),
};
1 ответ
При этом используются назначенные инициализаторы, которые были добавлены в C99. В разделе " Вперед " проекта стандарта C99 в пункте 5 говорится:
[...] Основные изменения по сравнению с предыдущим изданием:
и имеет следующую пулю:
- назначенные инициализаторы
и детали покрыты в разделе 6.7.8
Инициализация и приведен следующий пример в пунктах 36 и 37:
Пример 12. Пространство может быть "выделено" с обоих концов массива с помощью одного указателя:
int a[MAX] = { 1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0 };
В приведенном выше примере, если MAX больше десяти, в середине будут некоторые нулевые элементы; если оно меньше десяти, некоторые из значений, предоставленных первыми пятью инициализаторами, будут переопределены вторыми пятью.
Документ gcc на назначенных инициализаторах имеет лучший пример:
Чтобы указать индекс массива, напишите '[index] =' перед значением элемента. Например,
int a [6] = {[4] = 29, [2] = 15};
эквивалентно
int a[6] = { 0, 0, 15, 0, 29, 0 };
Значения индекса должны быть константными выражениями, даже если инициализируемый массив является автоматическим.