结构在C中填充零

时间:2017-09-30 11:59:42

标签: c global-variables

我有以下代码:

.h文件:

typedef struct subsystem
{
    const char* name;
    SDL_bool (*fun_init)();
    SDL_bool (*fun_updt)();
    SDL_bool (*fun_quit)();
    void (*fun_poll)(SDL_Event* event);
} subsystem_t;

subsystem_t audio_subsystem;

.c文件:

SDL_bool audio_init()
{
    SDL_Log("Audio Init");
    return SDL_TRUE;
}

SDL_bool audio_quit()
{
    SDL_Log("Audio Quit");
    return SDL_TRUE;
}

subsystem_t audio_subsystem = {"Audio", audio_init, NULL, audio_quit, NULL};

当程序运行时,audio_subsystem具有以下数据(带有一些日志功能):

(null):: 00000000 :: 00000000 :: 00000000 :: 00000000

在运行时,name为NULL,所有函数指针也是NULL,我不知道它为什么会发生,c编译器用零填充我的结构。

这是日志功能:

SDL_Log("%s :: %p :: %p :: %p :: %p", subsystem->name, subsystem->fun_init, subsystem->fun_updt, subsystem->fun_quit, subsystem->fun_poll);

编辑:

  

在subsystem_t之前添加extern关键字audio_subsystem解决了我的问题   问题,我认为这是默认大声笑。谢谢所有帮助过的人,   爱你们!

1 个答案:

答案 0 :(得分:4)

标题文件中的这一行:

subsystem_t audio_subsystem;

不仅仅是一个声明,它是文件范围内静态变量的定义,它将使用零值进行初始化。此外,包含标题的每个编译单元将定义自己的audio_subsystem

显然,您的C文件不包含其标题,否则此行:

subsystem_t audio_subsystem = {"Audio", audio_init, NULL, audio_quit, NULL};

将被标记为重新定义相同的符号。

要修复错误,您可以使用extern关键字将标题中的变量标记为声明:

extern subsystem_t audio_subsystem;

这只是声明一个没有数据的变量。头文件的用户知道存在这样的变量,并且在C文件中定义了变量本身(使用适当的初始化器)。

(但也许你可以找到一个更好的设计,不需要共享全局变量.C文件也应该包含自己的标题以捕捉这些错误。)