2015-10-30 65 views
0

我想声明的虚拟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; 
+0

取而代之的是让虚拟节点成为'Node head; head.next = NULL;'然后使用'&head'代码以前使用'head'的地方。 – chux

+0

IDE不会发出这种错误。这是什么编译器? – usr2564301

+1

请说明你的约束和要求是什么。显而易见的事情就是将'head'变量声明为全局变量,然后在函数中进行初始化。 – kaylum

回答

2

明显要做的事情就是刚刚宣布头变量作为一个全球性的,但然后做一个函数内初始化。

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; 
} 
0

从C99标准:

6.7.8 Initialization

Constraints

4 All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

因此,

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(); 
    ... 
} 
+0

为什么在malloc()里面有'* node'而不是'Node'?@RSahu – Nikola

+0

如果'头'是全局性的(如OP所要求的)那么代码仍然不会得到相同的“初始化元素不是常量”错误? – kaylum

+0

它确实给出了同样的错误@RSahu – Nikola

1

在节中的标准C11状态6.7.9第4部分:

所有对于具有静态或线程存储期限为常量表达式或字符串文字的对象的初始化的表达式。

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