初始化结构数组,为什么使用struct变量不起作用

我是C的新手。如果有人能够帮助理解为什么第13,14和16行的代码不起作用,但第17-20行有效,我将不胜感激。

使用第一个选项(第13,14和16行),我得到了错误

error: initializer element is not constant 

这是什么意思? 此外,这是否意味着不能使用某种类型的变量来生成新变量?

谢谢。

 // Define structure for a good 5 struct good { 6 char goodname; 7 double p; //starting proportion 8 int theta; //average utility 9 int sigma; //variance of error 10 }; 11 12 // The goods H and L 13 struct good H = {.goodname = 'H', .p = 0.5, .theta = 100, .sigma = 20}; 14 struct good L = {.goodname = 'L', .p = 0.5, .theta = 75, .sigma = 20}; 15 16 struct good goods[2] = {H, L}; // **Does not work** // ** Works** 17 struct good goods[2] = { 18 {.goodname = 'H', .p = 0.5, .theta = 100, .sigma = 20}, 19 {.goodname = 'L', .p = 0.5, .theta = 75, .sigma = 20} 20 }; 

H和L是包含数据的存储位置。 该声明:

  struct good goods[2] = {H, L}; // **Does not work** 

意味着货物应指向H和L,或包含与H和L相同的值。

或者,将数据从H和L复制到货物[0]和[1],或者将货物修改为指针数组,如下所示:

  struct good *goods[2]; goods[0] = &H; goods[1] = &L; 

第16行不起作用的原因与为什么这个更简单的例子不起作用的原因相同:

 const int a = 5; int b = a; // Does not work: "initializer element is not constant" 

这意味着您需要在初始化程序中仅使用编译时常量表达式。 C不考虑变量编译时常量,即使是const (C ++,另一方面,考虑const变量编译时常量)。

这意味着在C中,您只能使用常量表达式来初始化具有静态存储持续时间的数组或结构。

在您的示例中,所有对象都具有静态存储持

  struct good H = {.goodname = 'H', .p = 0.5, .theta = 100, .sigma = 20}; 

上面的初始化器是文字,文字是C中的常量表达式,所以没关系。

  struct good goods[2] = {H, L}; 

但是这里的HL对象不是常量表达式,因此编译器会给出错误。

C对常量表达式有一个相当严格的定义,并且对象的值不被视为常量表达式(即使对象是const限定的或用文字初始化)。

即使变量已经全局初始化1 (并且即使它是const限定的),变量的值本身也不是常量表达式。

指向静态持续时间变量2的指针是“扩展常量表达式”,可用于初始化指针变量,因此您可以执行以下操作:

 struct good *goods[2] = {&H, &L}; 

例如,如果这适合问题。


1是的,我知道“全球初始化”并不是很明确。 :-)我的意思是,如果它是一个已初始化的静态持续时间变量,并且在新的初始化程序点可见。

2即任何“全局”(文件范围)变量,或块内的static变量。

如果对象是静态的“goods [0] / goods [1]”,则只能用常量初始化。 所以,你没有得到初始化“好H”的错误的原因。

如果将变量定义为非静态变量(对于e..g,在main()或任何函数()中),则不会出现此错误,因为该对象将被视为“auto”。