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

Global struct in c (initializer element is not a compile-time constant)

我是 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: error: initializer element is not a compile-time constant struct env *list = mkEnv("p" , 0 , NULL);

我在谷歌上搜索了错误信息后明白了这个错误的含义,但是 有没有办法在函数外部的某处创建结构而不会出现此编译错误?

为了更清楚: 我想创建一个如上定义的结构(就好像它是列表的头部)。这样我所有的函数都可以访问它并向它添加东西。那就是将其解析为列表 and/or 在该列表中添加新元素。

提前致谢!

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

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

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

现在指针list已经初始化,可以使用了,但是要注意它不是用malloc创建的,所以不能freed或者重新分配已分配。

定义变量,并在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});

注意应用于初始化器的结构转换和应用于它的 addess of 运算符 & ;-)
详细部分:(struct env){ NULL, "pot" , 0} 告诉编译器初始化器 { NULL, "pot" , 0} 被引用到结构 struct env,这指示编译器创建 struct env 的初始化实例。然后我们得到这个结构的地址,使用&运算符,并将它赋值给指针list.
适用于 C99 和 C11 编译器。