3

我有一些 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),
};
4

1 回答 1

3

这是使用C99中添加的指定初始化程序,第5段中C99 草案标准的前向部分说:

[...] 与上一版本相比的主要变化包括:

并具有以下项目符号:

— 指定的初始化器

详细信息在6.7.8 初始化部分中进行了介绍,并在第3637段中提供了以下示例:

示例 12 可以使用单个指示符从数组的两端“分配”空间:

int a[MAX] = {
  1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0
};

上面如果MAX大于十,中间会有一些零值元素;如果小于 10,前五个初始化器提供的一些值将被后五个初始化器覆盖。

指定初始化器上的gcc 文档有一个更好的例子:

要指定数组索引,请在元素值之前写入 '[index] ='。例如,

int a[6] = { [4] = 29, [2] = 15 };

相当于

int a[6] = { 0, 0, 15, 0, 29, 0 };

索引值必须是常量表达式,即使正在初始化的数组是自动的。

于 2014-01-07T22:52:57.040 回答