为什么我们不能初始化结构内的成员?

为什么我们不能初始化结构内的成员?

例:

struct s { int i = 10; }; 

如果你想在struct 声明中初始化非静态成员:

在C ++(而不是C)中, structs几乎与类的同义,并且可以在构造函数中初始化成员。

 struct s { int i; s(): i(10) { } }; 

如果你想初始化一个实例

在C或C ++中:

 struct s { int i; }; ... struct s s_instance = { 10 }; 

C99也有一个称为指定初始化程序的function:

 struct s { int i; }; ... struct s s_instance = { .i = 10, }; 

还有一个GNU C扩展与C99指定的初始化器非常相似,但最好使用更便携的东西:

 struct s s_instance = { i: 10, }; 

直接的答案是因为结构定义声明了一个types而不是一个可以被初始化的variables。 你的例子是:

 struct s { int i=10; }; 

这不会声明任何variables – 它定义了一个types。 要声明一个variables,你可以在}和 ,然后你会初始化它:

 struct s { int i; } t = { 10 }; 

Checker指出,在C99中,你也可以使用指定的初始化器(这是一个奇妙的改进 – 有一天,C将赶上Fortran 66用于数据初始化的其他function,主要是重复初始化可指定的次数)。 有了这个简单的结构,没有任何好处。 如果你有一个20个成员的结构,并且只需要初始化其中的一个(比如说因为你有一个标志,表明结构的其余部分是初始化的),它就更有用了:

 struct s { int i; } t = { .i = 10 }; 

这个符号也可以用来初始化联合,以select联合的哪个元素被初始化。

编辑:这个问题最初是标记为c++但海报说,这是关于c所以我重新标记的问题,我离开的答案,但…

在C ++中, struct只是一个默认为public而不是private的成员和inheritance类。

C ++只允许static const成员内联初始化,其他成员必须在构造函数中初始化,或者如果struct是初始化列表中的POD (声明variables时)。

 struct bad { static int answer = 42; // Error! not const const char* question = "what is life?"; // Error! not const or integral }; struct good { static const int answer = 42; // OK const char* question; good() : question("what is life?") // initialization list { } }; struct pod { // plain old data int answer; const char* question; }; pod p = { 42, "what is life?" }; 

请注意,在C ++ 11中,现在允许使用以下声明:

 struct s { int i = 10; }; 

这是一个古老的问题,但它在谷歌排名高,也可以澄清。

我们不能初始化,因为当我们声明任何结构而不是实际上我们做的时候,只要告诉编译器他们的存在,即没有分配内存,如果我们初始化成员没有内存。 通常,当初始化任何取决于我们声明variables编译器为该variables分配内存的地方时,会发生什么情况。

 int a = 10; 
  • 如果它是自动的而不是堆栈内存将分配
  • 如果它是全局的而不是数据部分内存将分配

那么需要什么内存来保存这些数据,但是如果结构没有内存,那么就不可能初始化它。

正如你所说,这只是一个成员而不是一个variables。 当你声明一个variables时,编译器也会为那些你可以放置值的variables提供内存空间。 在一个struct成员的情况下,编译器没有为它提供内存空间,所以除非你创build一个结构types的variables,否则你不能赋值给结构成员。