下面的小示例程序给我一个断言错误('settings!= NULL'失败)我无法理解为什么它认为设置结构指针是NULL。
文件test.c:
#include <fluidsynth.h>
int main(int argc, char** argv)
{
fluid_settings_t* settings = new_fluid_settings();
fluid_synth_setint(settings, "synth.polyphony", 128); //assertion error
delete_fluid_settings(settings);
return 0;
}
编译:gcc test.c -lfluidsynth。
我已经尝试打印new_fluid_settings()返回的地址,但它对我来说似乎是一个有效的地址。
所以我搜索了fluidynth 1.1.5源代码,找到了utils / fluid_settings.c文件的第1213行:
fluid_return_val_if_fail (settings != NULL, 0);
但是fluid_return_val_if_fail只是一个用于调用GLib的g_return_val_if_fail的简单宏(utils / fluid_sys.h:59)。
由于设置地址是有效的,我想不出别的东西。 NULL指针指向地址0x00是不是真的?
我忘记了重要的事情吗?
答案 0 :(得分:0)
使用前打印地址,例如使用printf("the settings are at %p\n", settings);
;你当然也可以自己添加保护:
if (settings != NULL)
{
fluid_synth_setint(settings, "synth.polyphony", 128);
}
如果是_new()调用失败,你需要深入研究为什么会发生这种情况。
过去,您必须手动初始化FluidSynth似乎依赖的glib库,但这不再是必需的。
我看了一下,似乎它试图在设置对象中初始化一个互斥锁(为了使它成为线程安全的,我假设),所以你可能需要添加对g_thread_init()
的调用在致电main()
之前致new_fluid_settings()
。