3

以下に再現されたCコードが少しあります。BootPML4 配列の特定のビットを特定の値に設定していると理解しています。BootPML4以下の配列がどのように満たされているかを誰か説明してもらえますか? また、以下の 2 つの設定がそのまま維持されるようにしながら、配列内の未使用の値がゼロになるようにするにはどうすればよいですか?

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 ドラフト標準のForwardセクションには、次のように記載されています。

[...] 前版からの主な変更点は次のとおりです。

次の箇条書きがあります。

— 指定された初期化子

詳細はセクション6.7.8 初期化で説明されており、段落3637で次の例を示しています。

例 12 1 つの指定子を使用して、配列の両端からスペースを「割り当てる」ことができます。

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

上記で、MAX が 10 より大きい場合、中間に値がゼロの要素がいくつかあります。10 未満の場合、最初の 5 つのイニシャライザによって提供される値の一部は、2 番目の 5 によってオーバーライドされます。

指定された初期化子に関するgcc docには、より良い例があります。

配列インデックスを指定するには、要素値の前に「[index] =」を記述します。例えば、

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

と同等です

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

初期化される配列が自動であっても、インデックス値は定数式でなければなりません。

于 2014-01-07T22:52:57.040 に答える