C 初始化结构数组时,为什么使用结构变量不起作用
我对C非常陌生。如果有人能帮助理解为什么第13、14和16行的代码不起作用,而第17-20行的代码起作用,我将不胜感激 对于第一个选项(第13、14和16行),我得到了错误C 初始化结构数组时,为什么使用结构变量不起作用,c,struct,C,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
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 };
这意味着在C语言中,只能使用常量表达式初始化具有静态存储持续时间的数组或结构 在您的示例中,所有对象都具有静态存储持续时间,但:
struct good H = {.goodname = 'H', .p = 0.5, .theta = 100, .sigma = 20};
上面的初始值设定项是文本,而文本是C中的常量表达式,所以这是可以的
struct good goods[2] = {H, L};
但是这里的H
和L
对象不是常量表达式,因此编译器会给您一个错误
C对常量表达式的定义相当严格,并且对象的值不被视为常量表达式(即使对象是限定的或用文字初始化的)。这意味着在C中只能使用常量表达式初始化具有静态存储持续时间的数组或结构 在您的示例中,所有对象都具有静态存储持续时间,但:
struct good H = {.goodname = 'H', .p = 0.5, .theta = 100, .sigma = 20};
上面的初始值设定项是文本,而文本是C中的常量表达式,所以这是可以的
struct good goods[2] = {H, L};
但是这里的H
和L
对象不是常量表达式,因此编译器会给您一个错误
C对常量表达式的定义相当严格,对象的值不被视为常量表达式(即使对象是
const
限定的或用文字初始化的)。第16行不起作用的原因与此简单示例不起作用的原因相同:
const int a = 5;
int b = a; // Does not work: "initializer element is not constant"
这意味着您只需要在初始值设定项中使用编译时常量表达式。C不考虑变量编译时常数,甚至<代码> const (C++,另一方面,考虑代码> const < /COD>变量编译时间常数)。 < P>原因16行不工作,这就是为什么这个简单得多的例子不能工作的原因:
const int a = 5;
int b = a; // Does not work: "initializer element is not constant"
这意味着您只需要在初始值设定项中使用编译时常量表达式。C不考虑变量编译时常数,甚至<代码> const (C++,另一方面,考虑<代码> const < /COD>变量编译时间常数).< /p>
变量的值,即使变量已经初始化为GLUARLY1(即使它是代码> const 合格),它本身不是一个常量表达式
指向静态持续时间变量2的指针是一个“扩展常量表达式”,可用于初始化指针变量,因此您可以执行以下操作:struct good *goods[2] = {&H, &L};
例如,如果这符合问题的话
1是的,我知道“全局初始化”的定义不太明确。:-)我的意思是,如果它是一个已经初始化的静态持续时间变量,并且在新的初始值设定项处可见
2即,任何“全局”(文件范围)变量或块内的
静态变量。变量的值,即使该变量已全局初始化1(并且即使它是常量
-限定的),本身也不是常量表达式
指向静态持续时间变量2的指针是一个“扩展常量表达式”,可用于初始化指针变量,因此您可以执行以下操作:
struct good *goods[2] = {&H, &L};
例如,如果这符合问题的话
1是的,我知道“全局初始化”的定义不太明确。:-)我的意思是,如果它是一个已经初始化的静态持续时间变量,并且在新的初始值设定项处可见
即,任何“全局”(文件范围)变量,或块内的静态变量。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;
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;
如果对象是静态的“货物[0]/货物[1]”,则只能使用常量进行初始化。因此,您没有在初始化“good H”时出错的原因是
如果将变量定义为非静态变量(例如,在main()或任何函数()中),则不会出现此错误,因为对象将被视为“自动”。如果对象是静态的“货物[0]/货物[1]”,则只能使用常量初始化。因此,您没有在初始化“good H”时出错的原因是
如果将变量定义为非静态变量(例如,在main()或任何函数()中),则不会出现此错误,因为对象将被视为“自动”