C 对结构数组的赋值失败,返回“0”;错误:初始值设定项元素不是常量;

C 对结构数组的赋值失败,返回“0”;错误:初始值设定项元素不是常量;,c,C,当我试图初始化一个包含结构元素的全局数组时,我得到了“错误:initializer元素不是常量” a、 h a、 c GCC编译器 bash-3.2$ gcc -g a.h a.c a.c:8: error: initializer element is not constant a.c:8: error: (near initialization for 'T[0].msgbuf[0]') a.c:9: error: initializer element is not constant

当我试图初始化一个包含结构元素的全局数组时,我得到了“错误:initializer元素不是常量”

a、 h


a、 c



GCC编译器

bash-3.2$ gcc -g a.h a.c
a.c:8: error: initializer element is not constant
a.c:8: error: (near initialization for 'T[0].msgbuf[0]')
a.c:9: error: initializer element is not constant
a.c:9: error: (near initialization for 'T[1].msgbuf[0]')
a.c:10: error: initializer element is not constant
a.c:10: error: (near initialization for 'T[2].msgbuf[0]')
谢谢你的帮助。 你的回答启发了我,我修改了代码,现在可以正常工作了

MSG   T[MAX_QUE_NUM] = {
           {I1,   0, 0, 0, "CONFIG1",      {0}},
           {I2,   0, 0, 0, "CONFIG2",      {0}},
           {I3,   0, 0, 0, "CONFIG3",      {0}}, 
           0,
    }

谢谢您的回答。

您试图分配一个编译时编译器不知道但运行时知道的值-这就是导致错误的原因

尝试在main中执行此操作,例如:

main(){
  THREAD   T[MAX_QUE_NUM] = {
     {I1,   0, 0, 0, "CONFIG1",      a[MAX_MSG_NUM]},
     {I2,   0, 0, 0, "CONFIG2",      b[MAX_MSG_NUM]},
     {I3,   0, 0, 0, "CONFIG3",       c[MAX_MSG_NUM]},
     0
  };
}

在C语言中,具有静态存储持续时间的对象(如在文件范围内声明的对象)只能用常量表达式初始化

例如(在文件范围内声明):


a[MAX\u MSG\u NUM]
确实是非常量。它还表示一个
线程
实例,该实例恰好位于前面定义的数组之外,并且与应该传递到那里的类型不匹配(
char[]


所以它在很多方面都是错误的。

你是对的,我在这里发布了错误的代码,对不起。线程应该由自定义类型MSG替换。
MSG   T[MAX_QUE_NUM] = {
           {I1,   0, 0, 0, "CONFIG1",      {0}},
           {I2,   0, 0, 0, "CONFIG2",      {0}},
           {I3,   0, 0, 0, "CONFIG3",      {0}}, 
           0,
    }
main(){
  THREAD   T[MAX_QUE_NUM] = {
     {I1,   0, 0, 0, "CONFIG1",      a[MAX_MSG_NUM]},
     {I2,   0, 0, 0, "CONFIG2",      b[MAX_MSG_NUM]},
     {I3,   0, 0, 0, "CONFIG3",       c[MAX_MSG_NUM]},
     0
  };
}
char bla[] = {1, 2, 3, 4};  // correct
int a = 1;
char blop[] = {a, a + 1};   // incorrect, a is not a constant in C