结构初始化错误

时间:2015-04-24 23:35:58

标签: c struct initialization

我知道如何初始化结构(通常),但我遇到了麻烦 struct struct中的struct

typedef struct Location{
    uint8_t x;
    uint8_t y;
} loc;

typedef struct Person{
    loc location;
} person;

全局变量:

static person hero;

初始化函数:

void InitializeHero() {
    person hero = {0,0, {0,0}}; // this compiles
    hero.location = {0,0}; // but this does not compile
    hero = {0,0,{0,0}}; // this also does not compile
}

2 个答案:

答案 0 :(得分:3)

您的'此编译'行是正确的;这是一个初始化。其他两行不编译,因为它们不是初始化,而是分配。如果您使用的是足够新版本的C,则可以使用复合文字进行分配:

hero.location = (loc){0,0};
hero = (person){0,0,{0,0}};

注意 - person hero中的InitializeHero声明会影响全局变量;你可能不想那样。

是的,你错过了person中的一些字段吗?这些都不应该用您所展示的内容进行编译。

答案 1 :(得分:1)

您指示编译的行会产生警告。让我们分开您的InitializeHero功能。

person hero = {0,0, {0,0}};

在这里,您要实例化名为person的新hero结构。您使用大括号初始化方法来设置结构的成员。在这种情况下,person的唯一成员是locloc本身只有两个uint8_t。在这里使用大括号初始化方法,您只需使用{0, 0}

结合这两个,您可以编写如下语句:

person hero = {{0, 0}};

请注意,初始化时只能使用大括号初始化。您的其他两个陈述是分配。此时结构已经初始化,这就是为什么这两个语句不能编译。

另外请注意,您的全局变量static person hero已被hero中的本地变量InitializeHero所遮蔽。这意味着您要在person中创建单独的InitializeHero结构。但是,此静态变量在此情况下被声明为初始化,因此您的语句必须读取

static person hero = {{0, 0}};

...未使用InitializeHero