【问题标题】:How to assign value to a struct member of a struct?如何为结构的结构成员赋值?
【发布时间】:2015-12-20 08:20:33
【问题描述】:

我正在学习 C 中的嵌套结构,我想做的是能够为我的结构的成员结构分配一个值。我很难弄清楚这一点,我不想强​​迫自己在结构的初始化中初始化成员结构。为什么我编译这段代码时总是报错?

main.c: In function 'main':
main.c:16:23: error: expected expression before '{' token
  fooPerson.fullname = {"Foo", 'B', "Baz"};

 

#define LEN 20

struct names {
    char first[LEN];
    char middle;
    char last[LEN];
};

struct person {
    struct names fullname;
};

int main() {
    struct person fooPerson;
    fooPerson.fullname = {"Foo", 'B', "Baz"};

    // NOT this: it works, but not the solution I'm asking for
    // struct person fooPerson = {{"Foo", 'B', "Baz"}};
}

【问题讨论】:

  • 你只能初始化一次。而且数组是不可赋值的。
  • 对,我编辑了标题以反映您的评论。

标签: c struct nested


【解决方案1】:

初始化是在声明时赋予变量一个值的术语。其他的都是assignment

因此,如果您初始化您的变量,只有这样,您才能使用初始化列表{ })。

struct person fooPerson = { {"Foo", 'B', "Baz"} };

您也可以使用指定的初始化器:

struct person fooPerson =
{
  .fullname = 
  { 
    .first  = "Foo",
    .middle = 'B',
    .last   = "Baz"
  }
};

【讨论】:

    【解决方案2】:

    从 C99 开始,您可以为此使用复合文字:

    fooPerson.fullname = (struct names){ "Foo", 'B', "Baz" };
    

    如果你被 C89 卡住了,那么你大多不走运,除非你想做这样的事情:

    {
        struct names n = { "Foo", 'B', "Baz" };
        fooPerson.fullname = n;
    }
    

    Felix 在 cmets 中指出,这些都不是真正的初始化——它只是作为声明的一部分发生的初始化,这里不是这种情况。相反,两者都是任务。不过,这应该可以满足您的需求。

    【讨论】:

    • 放弃我对此的回答,但请添加它不是初始化,因为初始化发生在声明中(根据定义)。
    • 是的,请指出这都不是初始化,因为 OP 对该术语感到困惑。同样在 C89 中,没有什么能阻止您声明第二个结构变量、初始化它并在运行时复制它。这就是这段代码正在做的事情。 fooPerson = n; 在 C89 中可以正常工作,不需要 memcpy,因为这里没有指针。
    • @Lundin:我不确定我对memcpy 的想法。无论如何,我将其编辑为正常作业。
    • @icktoofay 我主要想指出的是,对于这个例子,C99 和 C90 之间没有显着差异。要么允许您创建一个临时对象并进行运行时分配。
    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 2016-11-05
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2013-10-07
    相关资源
    最近更新 更多