为什么我们不能初始化结构内的成员?
为什么我们不能初始化结构内的成员?
例:
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,否则你不能赋值给结构成员。