C中的全局指针

时间:2012-12-11 06:58:31

标签: c pointers scheme interpreter

我是C的新手,我目前正在C中实施一个Scheme解释器。我已经接近尾声但是一个问题困扰着我,我还没有解决这个问题。

我想要一个指向结构的“globalEnvironment”指针,该结构在程序运行的整个过程中都会保留并且也会被修改(不是常量)。

/****************************************************************
 Creates the List as a pointer to the conscell structure
 */
typedef struct conscell *List;

/****************************************************************
 Creates a conscell structure, with a char pointer (symbol) and two pointers to
 * conscells (first and rest)
 */
struct conscell {
    char *symbol;
    struct conscell *first;
    struct conscell *rest;

};


List globalEnvironment;


/****************************************************************
 Function: globalVariables()
 --------------------
 This function initializes the global variables
 */
void globalVariables() {

globalEnvironment = malloc(sizeof (struct conscell));
globalEnvironment->symbol = NULL;
globalEnvironment->first = NULL;
globalEnvironment->rest = NULL;

}

如您所见,“List”是指向conscell结构的指针。所以我想要的是globalEnvironment列表是全局的。

问题是我不能在那里做malloc。如果我尝试以下内容:

List globalEnvironment = malloc(sizeof (struct conscell));

而不仅仅是“List globalEnvironment;”它给出了“初始化元素不是常量”的错误

为了解决这种情况,我创建了一个新的函数“globalVariables”,它在程序开始时运行,初始化globalEnvironment并分配内存。 它没有像我预期的那样工作,我不断为其他功能提出分段错误错误,我还没有写到这里以保持简单。

是否有另一种更简单的方法来向C中的结构声明指针(非常量)?

希望有人可以提供帮助, 谢谢

3 个答案:

答案 0 :(得分:6)

当您应该使用全局数据时,您似乎正在尝试malloc。你可以试试

struct conscell globalEnvironment;

请记住永远不要free

如果您需要一个指针句柄,那么您可以按列表中的单元格:

struct conscell _globalEnvironment;
List globalEnvironment = &_globalEnvironment;

但请记住,永远不要free _globalEnvironment

答案 1 :(得分:1)

malloc()是一个函数并调用任何函数(在运行时完成),因此它必须位于main()或其他函数定义中。

全局变量必须具有初始化列表必须是常量表达式。

ISO :c99 , 6.5.2.5 Compound literals : paragraph 3rd of constraints,

3
If the compound literal occurs outside the body of a function, the initializer list shall consist of constant expressions.

因此,当您在任何函数体外调用malloc()指针时,会收到该错误。

答案 2 :(得分:1)

我认为这是某种链表或类似的动态ADT,这就是你想使用malloc的原因。

这是通过适当的面向对象程序设计实现此功能的方法:

conscell.h

/****************************************************************
 Creates a conscell structure, with a char pointer (symbol) and two pointers to
 * conscells (first and rest)
 */
typedef struct conscell {
    char *symbol;
    struct conscell *first;
    struct conscell *rest;
} conscell_t;


void conscell_init (void);
void conscell_cleanup (void);
void conscell_add (something); // function that accesses the object

conscell.c

#include "conscell.h"
#include <stdlib.h>

static conscell_t* environment;


void conscell_init() 
{
  environment = malloc(sizeof (conscell_t));

  if(environment == NULL)
  {
    // error handling
  }

  environment->symbol = NULL;
  environment->first  = NULL;
  environment->rest   = NULL;
}

void conscell_cleanup (void)
{
  // perform all custom freeing of dynamic memory here

  free(environment);
  environment = NULL;
}

void conscell_add (something)
{
  // do something with "environment" here.
}