对结构数组的赋值失败,出现“错误:初始化元素不是常量”

时间:2012-02-28 08:16:50

标签: c

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

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;

交流转换器


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

感谢您的回答。

3 个答案:

答案 0 :(得分:3)

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

所以在这么多级别上错误。

答案 1 :(得分:2)

您尝试在编译时分配编译器无法识别但在运行时知道的值 - 这就是导致错误的原因。

尝试在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
  };
}

答案 2 :(得分:2)

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

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

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