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