【问题标题】:GTK gtk_label_set_text segmentation faultGTK gtk_label_set_text 分段错误
【发布时间】:2012-08-23 11:53:50
【问题描述】:

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

它在主窗口中创建一个标签,每次单击按钮(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() 标签 = 0xb6406608change_title() 标签 = 0x807bda8

【问题讨论】:

  • 你检查过吗,例如在调试器中,所有变量都可以吗?没有NULL 指针等?

标签: c gtk segmentation-fault


【解决方案1】:

在对key_press_event 进行简单的 Google 搜索后,我看到该事件的回调在小部件和用户数据指针之间有另一个参数。原型是这样的:

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

把你的函数改成这样很简单:

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

它应该可以工作。

【讨论】:

  • 谢谢,有些教程有时不包含 GdkEvent 参数,所以我也忘记了。不过,我应该在询问之前检查原型。
【解决方案2】:

您的 change_title 函数原型错误。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多