归零异常数组

时间:2014-01-07 22:49:24

标签: c designated-initializer

我有一些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 个答案:

答案 0 :(得分:3)

这是使用指定的初始值设定项,它已添加到 C99 ,<{3>}标准的转发部分 5 说:

  

[...]上一版的主要变化包括:

并有以下子弹:

  

- 指定的初始值设定项

并且详细信息在6.7.8 初始化部分中介绍,并在段落 36 37 中提供以下示例:

  

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

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

在上面,如果MAX大于10,则中间会有一些零值元素;如果它少了   如果超过10个,前五个初始值设定项提供的某些值将被第二个五个值覆盖。

指定的初始化程序上的C99 draft有一个更好的示例:

  

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

     

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

     

相当于

     

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

     

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