2012-08-23 56 views
0

我在学习GTK +,每次运行它时,这个简单的应用程序都会崩溃。GTK gtk_label_set_text segmentation fault

它在主窗口中创建一个标签,并且每次点击一个按钮(key_press_event)标签和标题应该交换。

如果我在change_title函数中注释掉gtk_label_set_text,标题会正确切换并且应用程序不会崩溃。为什么gtk_label_set_text会导致我的应用崩溃?

#include <gtk/gtk.h> 
#include <string.h> 

const gchar first[]="FIRST"; 
const gchar last[]="LAST"; 

static void destroy(GtkWidget *window,gpointer data) 
{ 
    gtk_main_quit(); 
} 

static gboolean change_title(GtkWidget *widget,GtkLabel *data) 
{ 
    if(strcmp(last,gtk_window_get_title(GTK_WINDOW(widget)))){ 
    gtk_window_set_title(GTK_WINDOW(widget),last); 
    gtk_label_set_text(data,first); 
    } else { 
    gtk_window_set_title(GTK_WINDOW(widget),first); 
    gtk_label_set_text(data,last); 
    } 
    return FALSE; 
} 

int main(int argc,char **argv) 
{ 
    GtkWidget *window, *label; 
    gtk_init(&argc,&argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title(GTK_WINDOW(window),last); 
    gtk_widget_set_size_request(window,300,100); 
    g_signal_connect(window,"destroy_event",G_CALLBACK(destroy),NULL); 

    label = gtk_label_new("caasdasdjadnjadjahadjad"); 
    gtk_container_add(GTK_CONTAINER(window),label); 

    g_signal_connect(window,"key_press_event",G_CALLBACK(change_title),GTK_LABEL(label)); 

    gtk_widget_show_all(window); 

    gtk_main(); 
    return 0; 
}   

编辑:我发现使用GDB的问题,标签指针不正确地传递给change_title功能。我不知道为什么。 (例:在main()标签= 0xb6406608,在change_title()标签= 0x807bda8

+0

您是否检查过,例如在调试器中,所有变量都可以吗?没有'NULL'指针等? –

回答

2

key_press_event做一个简单的谷歌搜索后,我看到了回调该事件有小部件和用户数据指针之间的另一种说法。原型是这样的:

gboolean key_event_handler(GtkWidget *widget,GdkEventKey *event, gpointer data); 

所以简单的改变你的函数是:

static gboolean change_title(GtkWidget *widget, GdkEventKey *event, GtkLabel *data) 

,它应该工作。

+0

谢谢,有些教程有时不包含GdkEvent参数,所以我也忘了它。我应该在查询之前检查原型。 –

1

您的change_title函数有错误的原型。

请参阅the documentation了解正确的原型。大多数*-event信号传递实际事件作为处理函数中的参数,因为处理程序通常需要检查事件才能执行。例如,这里的GdkEventKey事件将包含关于哪个键被按下(或释放)的信息。

相关问题