struct A数组的静态初始化,其中struct A包含指向struct B数组的指针(在C中)

时间:2016-07-10 13:33:24

标签: c arrays struct

给出以下typedef:

// Structures for kana to romaji conversion lookup
typedef struct {
  const u16 kana; // Kana codepoint
  const char* romaji;
} KanaSuffix;

typedef struct {
  // Kana codepoint is implied by position in array
  const char* romaji;
  const KanaSuffix* suffixes;
} KanaPrefix;

是否可以在一个步骤中静态初始化KanaPrefix数组,其中数组的某些元素有suffixes指向KanaSuffix的静态数组?

现在我正在这样做:

const KanaSuffix KANA_SUFFIXES_KI[] = {
  { 0x3030, "kya" },
  { 0x3032, "kyo" }
};

const KanaPrefix KANA_TO_ROMAJI[] = {
  { NULL, NULL },
  { "a", NULL },
  { "ki", KANA_SUFFIXES_KI }
};

但我想做更像这样的事情:

const KanaPrefix KANA_TO_ROMAJI[] = {
  { NULL, NULL },
  { "a", NULL },
  { "ki", {
    { 0x3030, "kya" },
    { 0x3032, "kyo" }
  } }
};

2 个答案:

答案 0 :(得分:6)

您可以执行以下操作:

const KanaPrefix KANA_TO_ROMAJI[] = {
  { NULL, NULL },
  { "a", NULL },
  { "ki",  (KanaSuffix [2]) {
      { 0x3030, "kya" },
      { 0x3032, "kyo" }
    }
  }
};

修改

我可以[现在]确认这是已定义的行为,因为复合文字的生命周期[或持续时间]与静态存储相同:

  

C99§6.5.2.5复合文字

     

复合文字的值是未命名对象的值   由初始化列表初始化。如果出现复合文字   在函数体外,该对象具有静态存储   持续时间;否则,它有自动存储持续时间   封闭的块。

参考文献:

What is the lifetime of compound literals passed as arguments?

答案 1 :(得分:6)

如果您只需要一个静态对象,那么您可以使用复合文字,因为如果在函数范围之外定义,则具有静态存储持续时间。

当然,由于结构suffixes的成员KanaPrefix指向多个元素,您还需要存储计数:

typedef struct {
  const char* romaji;
  const KanaSuffix* suffixes;
  const size_t count;   
} KanaPrefix;

const KanaPrefix KANA_TO_ROMAJI[] = {
  { NULL, NULL , 0 },
  { "a", NULL , 0 },
  { "ki", ( KanaSuffix[2] ){ //this is a compound literal
    { 0x3030, "kya" },
    { 0x3032, "kyo" }
  } , 2 }  //count is here
};