Обнуление необычного массива

У меня есть немного кода 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 };

Значения индекса должны быть константными выражениями, даже если инициализируемый массив является автоматическим.

Другие вопросы по тегам