2015-09-23 75 views
1

我正在学习C中的嵌套结构,我想要做的是能够为我的结构的成员结构赋值。我无法弄清楚这一点,我不想强​​迫自己初始化结构的初始化成员结构。为什么我在尝试编译此代码时不断收到错误?如何将值赋给struct的struct成员?

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"}}; 
} 
+0

只能初始化一次的东西。数组不可分配。 – juanchopanza

+0

对,我编辑了标题以反映您的评论。 – zxgear

回答

5

在C99开始,您可以使用复合字面常量此:

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

如果你坚持C89,虽然,你大多是出于运气,除非你想这样做:

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

Felix在评论中指出,这些都不是真正的初始化 - 它只是作为声明的一部分发生的初始化,在这里不是这种情况。相反,两者都是任务。不过,这应该做你想做的。

+1

删除我的答案,但请添加它不是*初始化*,因为初始化发生(定义)在声明中。 –

+0

是的,请指出这些都不是初始化,因为OP对这个术语感到困惑。同样在C89中,没有任何东西阻止你声明第二个结构变量,将它初始化并在运行时拷贝它。这是什么代码在做什么。 'fooPerson = n;'在C89中工作得很好,不需要memcpy,因为这里没有指针。 – Lundin

+0

@Lundin:我不确定我在用'memcpy'想什么。无论如何,我编辑它是一个正常的任务。 – icktoofay

0

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

因此,如果您初始化您的变量,只有这样,你可以使用一个初始化列表(该{ })。

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

或者您可以使用指定的初始化:

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