struct变量初始化

时间:2014-08-01 08:16:23

标签: c struct initialization

我尝试按如下方式初始化struct变量:

struct Abc{
    char str[10];
};

int main(){
    struct Abc s1;
    s1.str="Hello";  //error
}

我可以理解这种行为,因为它与

相同
char str[10];
str="Hello"; // incompatible types

但请看下面的初始化

struct Abc s1={"Hello"};   //This is fine

struct Abc s2={.str="Hello"};  //This is also fine

我记得在毕业时,我读了很多教科书,说这两个初始化都是同一个东西(即使用{}符号初始化struct变量并明确使用(。)运算符是相同的事情)。但上面的讨论证明它们并不相同。

我的问题是这些初始化之间究竟有什么区别?

3 个答案:

答案 0 :(得分:7)

区别在于,这两行

struct Abc s1={"Hello"};   //This is fine
struct Abc s2={.str="Hello"};  //This is also fine

初始化,而此

s1.str="Hello";

作业。您可以将char数组初始化为字符串文字,但不能通过赋值。

答案 1 :(得分:3)

可以将此struct Abc s2={.str="Hello"};称为指定初始化,而struct Abc s1={"Hello"};通用初始化。

让我用例子解释这个指定初始化的优点。

假设结构具有类似struct ex{ char *name; int age; char *city; char *country }的变量。在这个如果你想初始化只有城市和国家指定初始化可以使用。 但是在一般初始化的情况下,每个成员需要单独初始化。这也是程序员和复杂的开销。

答案 2 :(得分:2)

以下赋值语句完全相同(但错误):

s1.str="Hello";& str = "Hello";

区别在于第一个是struct内的字符串。

顺便说一句,初始化意味着在定义时为变量赋值。

struct Abc s1;声明并定义s1,因此您将其初始化为:

struct Abc s1={"Hello"};   //This is fine
struct Abc s2={.str="Hello"};  //This is also fine 

这样做

struct Abc s1;
s1.str="Hello";

不是初始化,它只是常量字符串文字分配给不兼容的str指针。