我尝试按如下方式初始化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变量并明确使用(。)运算符是相同的事情)。但上面的讨论证明它们并不相同。
我的问题是这些初始化之间究竟有什么区别?
答案 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
指针。