Malloced全局变量实现(C)

时间:2013-05-03 07:18:46

标签: c global-variables

我想在多个.c文件中全局提供链接列表。

我已经阅读了如何执行此操作,但我无法确定导致问题的原因。

我在LinkedList.h中声明了带extern的变量:

extern LinkedList* canQueue;

然后在main.c中我通过将变量发送到LinkedList.c中的函数来初始化变量,如下所示:

LinkedList *canQueue=createList();

这是LinkedList.c中的create函数:

LinkedList* createList() /*creates empty linked list*/
  {
    LinkedList* myList;
    myList = malloc(sizeof(LinkedList));
    myList->head = NULL;
    return myList;
  }

然后我想在另一个文件cpu.c中使用canQueue。我在cpu.c中包含了LinkedList.h,所以此时应该从我所知的链接列表中获取。但是当我尝试访问它时,我收到一个错误:

undefined reference to 'canQueue'

我错过了什么或做错了吗?

2 个答案:

答案 0 :(得分:2)

似乎你根本就没有定义这样的全局变量。如果此代码编译:

LinkedList *canQueue = createList();

那么它不是“全局”(文件范围)变量。在文件范围定义它并仔细初始化它,这样就不会用局部变量对其进行遮蔽。总而言之,做这样的事情:

// at global scope
LinkedList *canQueue;

void initialize() // or whatever
{
    canQueue = createList();
}

答案 1 :(得分:1)

初始化时,您需要为全局变量指定常量。并且函数的return不被视为常量。因此,以下将显示错误:

 LinkedList *canQueue=createList();

编辑我错过了您已在*canQueue而不是function scope声明并初始化指针file scope。这违反了{global variable的定义{1}}。但是还有一个问题。如果你在文件范围内声明LinkedList *canQueue=createList();之类的内容,你会收到以下错误:

     Initializer element not constant

由于对象将在文件范围“声明”,因此它具有静态存储持续时间。静态存储持续时间对象的初始化程序必须是常量表达式。函数调用的结果不是常量表达式