【问题标题】:Initializer element is not constant [duplicate]初始化元素不是常量[重复]
【发布时间】:2015-10-30 21:05:54
【问题描述】:

我正在尝试将虚拟 head* 声明为全局变量,但 IDE 出现此错误:

initializer element is not constant

我该如何解决这个问题?

typedef struct MyNode{
    struct MyNode *next;
    int value;
}Node;

//Declare a global variable
Node *head = malloc(sizeof(Node));
head->next = NULL;

【问题讨论】:

  • 取而代之的是让假人成为Node head; head.next = NULL;,然后在代码之前使用head的地方使用&head
  • IDE 不会发出此类错误。这是什么编译器?
  • 请说明您的限制和要求是什么。显而易见的事情就是将head 变量声明为全局变量,然后在函数中进行初始化。
  • @kaylum,但是怎么做?如何将头变量声明为全局变量,然后在函数中进行初始化?
  • 是的,head 可以初始化为NULL,因为NULL 是一个(扩展为)常量表达式的宏。

标签: c


【解决方案1】:

显而易见的事情就是将头变量声明为全局变量,然后在函数中进行初始化。

typedef struct MyNode{
    struct MyNode *next;
    int value;
} Node;

Node *head;

int main (int argc, char **argv)
{
    head = malloc(sizeof *head);
    if (!head) {
        /* error */
        exit(-1);
    }

    head->next = NULL;

    return 0;
}

【讨论】:

    【解决方案2】:

    您不能在函数之外进行分配。 在这里您可以找到完整的讨论: Structure member assignment causing syntax error when not inside a function

    【讨论】:

    • 良好的交叉引用。
    【解决方案3】:

    C11 标准在第 6.7.9 节第 4 部分中声明:

    具有静态或线程存储持续时间的对象的初始化程序中的所有表达式都应为常量表达式或字符串文字。

    您的指针head 正在使用函数调用进行初始化,该函数调用不是常量表达式。使用函数调用对其进行初始化的唯一方法是在函数内部声明它(但是,由于上述限制,如果使用 static 声明它,这将不起作用)。或者,您可以让指针默认初始化为NULL,然后稍后将其分配给malloc()

    【讨论】:

      【解决方案4】:

      来自 C99 标准:

      6.7.8 初始化

      约束

      4 具有静态存储持续时间的对象的初始化程序中的所有表达式应为常量表达式或字符串字面量。

      因此,

      Node *head = malloc(sizeof(Node));
      

      不允许。您可以使用常量表达式初始化head,例如 NULL。

      Node *head = NULL;
      

      当然,像这样的语句:

      head->next = NULL;
      

      不允许外部函数。因此,head 的正确初始化必须在函数中完成。一种方法是:

      Node* head = NULL;
      
      Node* createNode()
      {
         Node* node = malloc(sizeof(*node));
         node->value = 0;
         node->next = NULL;
         return node;
      }
      
      int main()
      {
         head = createNode();
         ...
      }
      

      【讨论】:

      • 为什么*node 里面有malloc() 而不是Node?? @RSahu
      • 如果 head 是全局的(正如 OP 所要求的那样),该代码是否仍会出现相同的“初始化器元素不是常量”错误?
      • 它确实给出了同样的错误@RSahu
      • @kaylum,说得好。现在我把 C++ 和 C 搞混了。
      • @Nikola,使用x = malloc(sizeof(*x)); 是一个很好的习惯用法。它避免了sizeof的参数错误。
      猜你喜欢
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 2020-03-27
      • 2012-04-10
      • 2013-12-08
      • 2014-05-25
      相关资源
      最近更新 更多