我有一些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),
};
答案 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};
索引值必须是常量表达式,即使正在初始化的数组是自动的。