我正在尝试向我使用 g_signal_connect 创建的函数发送结构的指针,但是遇到了分段错误。经过一些测试,我决定将指针的地址打印在被调用的函数内(此函数负责在drawing_area上进行绘制,这意味着它定期通过 g_timeout_add 进行调用>),并交替打印“(nil)”或正确的地址。我不知道是什么原因造成的。
typedef struct{
...
}prog_info
gboolean on_draw_event(GtkWidget *draw_area ,
cairo_t *cr ,
prog_info *info)
{
printf("\ninfo: %p",info); //this will give "(nil)" or the correct
address, alternating
...
}
gboolean time_handler (GtkWidget *draw_area)
{
if ((!GTK_IS_WIDGET(draw_area)) || (!gtk_widget_get_window (draw_area)))
return FALSE;
gtk_widget_queue_draw(draw_area);
return TRUE;
}
int main(int argc, char *argv[]) {
...
prog_info *info;
info =(prog_info *) calloc (1,sizeof(prog_info));
...
g_signal_connect(G_OBJECT(draw_area), "draw", G_CALLBACK(on_draw_event), info);
g_timeout_add (10, (GSourceFunc) time_handler, draw_area);
gtk_widget_show_all(window);
gtk_main();
return 0;
}
有两个不同的 g_signal_connect ,其中之一破坏了一切。