分配给结构数组失败,出现"error: initializer element is not constant"



当我试图初始化一个包含结构元素的全局数组时,我得到了"error:initializer element is not constant"

a.h


#define MAX_MSG_NUM 20
#define NAME_SIZE   15
#define MAX_QUE_NUM  10
typedef struct {
   int         index;
   int         tid;
   int         front;
   int         rear;
   char        name[NAME_SIZE];
   char        msgbuf[MAX_MSG_NUM];
} THREAD;
typedef enum {
   I1        = 0,
   I2        = 1,
   I3        = 2,
   I4        = 3
} DMTHREAD;

a.c


THREAD   a[MAX_MSG_NUM];
THREAD   b[MAX_MSG_NUM];
THREAD   c[MAX_MSG_NUM];
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
};

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,
    }

谢谢你的回答。

a[MAX_MSG_NUM]确实是非常数。它还表示一个Thread实例,该实例恰好在您之前定义的数组之外,并且与您应该传递到那里的类型(char[])不匹配。

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

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

试着在主要方面做,例如:

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中,具有静态存储持续时间的对象(如在文件范围中声明的对象)只能用常量表达式初始化。

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

char bla[] = {1, 2, 3, 4};  // correct
int a = 1;
char blop[] = {a, a + 1};   // incorrect, a is not a constant in C

相关内容

最新更新