GTK3 将结构传递给回调函数 - 发生异常,分段错误

Posted

技术标签:

【中文标题】GTK3 将结构传递给回调函数 - 发生异常,分段错误【英文标题】:GTK3 Passing Struct to Callback Function - Exception has occurred, segmentation error 【发布时间】:2022-01-11 17:59:05 【问题描述】:

我在任何函数之外创建了一个结构:

//create structure
typedef struct _LabelPointers

    GtkWidget *readstringslabel;
    GtkWidget *snoteslabel;
    GtkWidget *fnoteslabel;
    GtkWidget *genericnoteslabel;
    GtkWidget *tabslabel;
    GtkWidget *chordslabel;
 MyLabelPointers;

然后,我在调用函数内部创建了一个标签结构:

//create structure of widget label pointers (to be passed to functions)
MyLabelPointers labelpointers;
    
labelpointers.readstringslabel = gtk_label_new("0");
labelpointers.snoteslabel = gtk_label_new("0");
labelpointers.fnoteslabel = gtk_label_new("0");
labelpointers.genericnoteslabel = gtk_label_new("0");
labelpointers.tabslabel = gtk_label_new("0");
labelpointers.chordslabel = gtk_label_new("0");

然后,我连接回调如下,传递&labelpointers

g_signal_connect(G_OBJECT (window), "key_press_event",G_CALLBACK(pressspacebar), &labelpointers);

调用函数如下,接受*labelpointers:

gboolean pressspacebar (GtkWidget *widget, GdkEventKey *event,  MyLabelPointers *lpointers) 

然后我尝试更新labelpointers->readstringslabel 中的文本,如下所示:

gtk_label_set_text(GTK_LABEL(lpointers->readstringslabel), cdata);

或如:

gtk_label_set_text(GTK_LABEL(lpointers->readstringslabel), "NEW DATA");

它全部编译并运行,直到我得到“发生异常,分段错误”。就在错误之前,我打印到 shell 如下:

cout<<"before\n";
cout<<"lpointers.readstringslabel = "<<lpointers->readstringslabel<<"\n";
cout<<"lpointers.readstringslabel = "<<&lpointers->readstringslabel<<"\n";
cout<<"type = " << typeid(lpointers->readstringslabel).name() << "\n";

然后得到:

before
lpointers.readstringslabel = 0x4
lpointers.readstringslabel = 0x7fffffffd570
type = P10_GtkWidget

我希望这些信息足以帮助我解决这个我已经工作了三天的问题。不幸的是,即使是谷歌也没有帮我解决这个问题。

【问题讨论】:

请尝试提供一个完整且最小的示例来重现您的问题。 我已经确定这是一个线程问题。我在一个函数中创建了窗口,称为基于 按下的第二个函数,该函数用于执行例程来更新原始窗口中的标签 - 我了解到这是一个禁忌。我现在在被调用函数中创建第二个窗口,例程将显示更新后的标签。 【参考方案1】:

如果您将结构创建为堆栈变量 (MyLabelPointers labelpointers),则会在函数结束时将其丢弃,并且在调用回调时不再可用。您必须使用(g_new() 类似函数)动态分配您的结构 - 然后在不再需要时使用 g_free()

【讨论】:

谢谢。我最终创建了全局小部件并避免传递这些指针/变量。这对我有用。再次感谢。

以上是关于GTK3 将结构传递给回调函数 - 发生异常,分段错误的主要内容,如果未能解决你的问题,请参考以下文章

c++异步回调函数引用传递空指针异常

c ++分段错误将指针传递给函数

将指向数组的指针传递给函数时出现分段错误(C++)

将c ++引用的地址传递给指针

函数名作为参数传递与回调函数

无法将用户数据结构传递给 GTK 回调