Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.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_Global_Compile Time - Fatal编程技术网

c中的全局结构(初始值设定项元素不是编译时常量)

c中的全局结构(初始值设定项元素不是编译时常量),c,struct,global,compile-time,C,Struct,Global,Compile Time,我对C相当陌生,我有一些问题 我有以下结构定义: struct env { struct env *next; char varName[8]; int n; }; 我希望最终在我的一些函数中创建多个这样的结构,因此我创建了一个函数: struct env *mkEnv(char c[8] , int value , struct env *toadd){ struct env *enviroment = malloc(sizeof(struct env)); en

我对C相当陌生,我有一些问题

我有以下结构定义:

struct env {
  struct env *next;
  char varName[8];
  int n;
};
我希望最终在我的一些函数中创建多个这样的结构,因此我创建了一个函数:

struct env *mkEnv(char c[8] , int value , struct env *toadd){
    struct env *enviroment = malloc(sizeof(struct env));
    enviroment->n = value;
    enviroment->next = toadd;
    strcpy(enviroment->varName , c);
    return enviroment;
}
我想全局创建一个类似这样的结构,它是常量,带有一些常量值,并且最初具有指向下一个结构NULL的指针

所以我做了这样的事情:

    //not in a function
    struct env *list = mkEnv("pot" , 0 , NULL);

    //Beginning of a function
    int eval(struct expression *exp){
        ... // code here that might add a new structure to the pointer of list
    }
但是,我得到以下错误:

evalexp.c:116:20:错误:初始值设定项元素不是编译时 常量struct env*list=mkEnv(“p”,0,NULL)

在谷歌搜索错误消息后,我理解这个错误的含义,但是 有没有一种方法可以在函数之外的某个地方创建一个结构而不出现编译错误

更清楚地说: 我想创建一个如上定义的结构(就像它是列表的头一样)。这样我的所有函数都可以访问并添加内容。即将其解析为列表和/或在该列表中添加新元素


提前谢谢

无法在文件范围内调用函数

必须使用常量值并定义实际结构变量:

struct env lists = { NULL , "pot" , 0 };
struct env *list = &lists;

现在指针
列表已初始化,可以使用,但请注意,它不是用malloc创建的,因此无法释放或重新分配。

定义变量,并在
main
中初始化它

struct env *list;

int main() {
    list = mkEnv("pot" , 0 , NULL);
    ....
}

有时库会让您在使用库的任何函数之前调用函数来初始化库。为它们使用的全局变量赋值是它们这样做的原因之一。

可以使用以下语法:

struct env
{
  struct env *next;
  char varName[8];
  int n;
};
struct env *list = &((struct env){ NULL, "pot" , 0});
注意应用于初始值设定项的强制转换结构和应用于它的
运算符&的添加;-)
详细地说,部分:
(struct env){NULL,“pot”,0}
告诉编译器初始值设定项
{NULL,“pot”,0}
引用了struct
struct env
,这指示编译器创建
struct env
的初始化实例。然后,我们使用
&
运算符获取此结构的地址,并将其分配给指针
列表


适用于C99和C11编译器。

谢谢!我选择你的答案是因为它对我的问题更具体!虽然其他的也都是正确的!最好使用指定的初始化器。当
结构
发生更改时,这就不太容易出错(注意类型定义通常不直接靠近变量定义)。