8
  1 #include<stdio.h>
  2 #include<malloc.h>
  3 
  4 typedef struct node_t{
  5     int i;
  6     struct node_t* link;
  7 }node;
  8 
  9 node* head = (node *)malloc(sizeof(node));
 10 
 11 if(head == NULL){
 12     printf("\n malloc for head node failed! \n");
 13 }
 14 
 15 int main(){
 16     int i = 10;
 17     node* temp = NULL;
 18     temp = (node *)malloc(sizeof(node));
 19     if(temp == NULL){
 20         printf("\n malloc for temp node failed! \n");
 21     }
 22     else{
 23         while(i<=10){
 24             ;
 25         }
 26     }
 27     return 0;
 28 } 

编译错误:

linked.c:9:1: error: initializer element is not constant
linked.c:11:1: error: expected identifier or ‘(’ before ‘if’

我正在尝试一个简单的链表程序。它还没有完全完成。我收到编译错误。无法理解为什么会这样。

4

4 回答 4

13

由于您将其定义head为全局,因此它的初始化程序需要是一个常量——基本上,编译器/链接器应该能够在可执行文件中为其分配空间,将初始化程序写入该空间,然后完成。在初始化期间没有malloc像上面所做的那样调用 - 你需要在内部main(或你调用的东西main)内部进行调用。

#include <stdlib.h>

void init() { 
    head = malloc(sizeof(node));
}

int main() { 
    init();
    // ...
}

在这种情况下,您拥有的代码main实际上从未使用过head,因此您可以毫无问题地跳过上述所有内容。

于 2012-11-29T07:21:15.240 回答
12
 9  node* head = (node *)malloc(sizeof(node));
 10 
 11 if(head == NULL){
 12     printf("\n malloc for head node failed! \n");
 13 }

这些行在外部是不可能的,main()因为任何函数调用或可执行文件都应该在main()函数内部或从 main 调用的任何函数中。

为了linked.c:9:1: error: initializer element is not constant

外部只能有函数定义或任何全局初始化,main()但初始化器必须是常量表达式`。

您可以将其声明head为全局,但初始化是错误的。

像这样做 :

node * head =NULL // here initialization using constant expression


void function () // any function 
{
 head = malloc(sizeof(node));
}

对于linked.c:11:1: error: expected identifier,

if语句不能在任何函数之外。在您的情况下,将这些行放在 main 中并解决问题

于 2012-11-29T07:21:00.137 回答
3

head是一个全局变量。全局变量和静态变量必须由常量表达式(即文字)初始化。所以你不能做

node* head = (node *)malloc(sizeof(node));
于 2012-11-29T07:20:33.273 回答
0

您不能在全局范围内使用 malloc() 。或者你可以像关注

#include<stdio.h>
#include<malloc.h>
  :
node* head
  :
  :
int main(){
  :
  :
head = (node *)malloc(sizeof(node));
  :
  :
}
于 2012-11-29T07:37:56.347 回答