我是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中的结构声明指针(非常量)?
希望有人可以提供帮助, 谢谢
答案 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.
}