【问题标题】:Struct Initialization Error结构初始化错误
【发布时间】:2015-04-24 23:35:58
【问题描述】:

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

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
}

【问题讨论】:

  • 嗯?您的第一次初始化不会 编译。 { } 中有 4 个标量,结构中只有 2 个标量成员。这是 C 语言中的一个错误。
  • 或多或少复制到:stackoverflow.com/q/24138140/694576
  • 啊,是的,我很抱歉。我是 Stack Overflow 的新手,当我编辑代码以使语法符合系统的要求时,我一定是不小心删除了结构的一部分。结构 Person 最初有 4 个标量成员 {uint8_t x; uint8_t y;本地位置}

标签: c struct initialization


【解决方案1】:

您的“此编译”行是正确的;这是一个初始化。另外两行不编译,因为它们不是初始化,它们是赋值。如果您使用的是足够新的 C 版本,则可以使用复合文字来执行分配:

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

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

顺便说一句,您是否缺少person 中的某些字段?这些都不应该与你所展示的相一致。

【讨论】:

  • 是的,我的错。抱歉缺少字段(这些称为标量吗?)
  • 另外,复合文字的目的是什么?他们是为了清楚吗?因为它们看起来有点多余
【解决方案2】:

您指示编译的行会产生警告。让我们分解你的 InitializeHero 函数。

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

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

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

person hero = {{0, 0}};

注意初始化时只能使用大括号初始化。你的另外两个陈述是assignments。此时结构已经初始化,这就是这两条语句无法编译的原因。

另外请注意,您的全局变量static person hero 已被InitializeHero 中的本地 变量hero 遮蔽。这意味着您正在 InitializeHero 中创建一个单独的 person 结构。但是,在这种情况下,这个静态变量是在声明它的地方初始化的,所以你的语句必须阅读

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

...留下InitializeHero 未使用。

【讨论】:

  • 如果函数设置了全局变量(因此没有声明局部变量),它仍然有目的。您有时需要重新初始化一个全局变量,这样的函数可能是合适的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多