【问题标题】:C - using global structureC - 使用全局结构
【发布时间】:2013-11-22 11:46:31
【问题描述】:

我正在使用全局结构,因此我可以从任何地方设置/获取错误或状态。它工作正常,现在我遇到了麻烦。

结构

typedef struct program Program;
struct program
{
    int error;
    int state;
};

// global declarations
Program *program;

初始化

void init_memory(void)
{
program = malloc(sizeof(Program));
if(program == NULL)
{
    print_error(E_MEM_ALLOC);
    exit(EXIT_FAILURE);
}
program->state = S_NONE;
program->error = E_OK;
}

这里程序崩溃,当我删除“program->error = ....”时,程序工作正常...我不知道为什么:/

void check_file(char *filename)
{
FILE *file = fopen(filename, "r");

if(file == NULL)
{
    program->error = E_FILE_OPEN;
    return;
}

fclose(file);
}

整个程序:http://pastebin.com/dwSVQ9x8

【问题讨论】:

  • 什么是program?全局变量?您正在使用与结构同名的变量,而该结构又与 typedef'd 别名的名称相同?
  • 可能是个愚蠢的问题,但你真的在check_file之前打电话给init_memory吗?
  • 问题似乎不在这里。显示更多代码。
  • @FilipeGonçalves foo foo; 无效。
  • @FilipeGonçalves 我正要发表评论说完全相同:) 换句话说,typedef struct foo { int foo } foo foo; 无效,但 typedef struct foo { int foo } foo; void func(void){ foo foo;} 有效。

标签: c


【解决方案1】:

program 设为指针似乎没有必要,为什么不直接将其设为实际的struct

Program program = { .error = E_OK, .state = S_NONE };

那么您无需担心分配它(并且确实可以完全删除init_memory)。只需将对其成员的访问权限更改为使用. 而不是->,即program.error = E_FILE_OPEN

【讨论】:

  • (如果您的编译器不喜欢指定的初始化器,您也可以将其初始化为Program program = { E_OK, S_NONE }。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
相关资源
最近更新 更多