struct变量初始化

我尝试初始化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 

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

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

不同的是,这两行

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

正在初始化 ,而这

 s1.str="Hello"; 

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

这个struct Abc s2={.str="Hello"}; 可以称为指定初始化,而struct Abc s1={"Hello"}; 一般初始化。

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

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

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

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指针。