Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 初始化结构数组时,为什么使用结构变量不起作用_C_Struct - Fatal编程技术网

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

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

我对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 };

这意味着在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()或任何函数()中),则不会出现此错误,因为对象将被视为“自动”