【发布时间】:2021-11-21 03:32:50
【问题描述】:
虽然已经回答了关于这种情况的类似问题,但我被困住了。
我正在使用结构将数据传递给 GTK 回调。结构定义为
typedef struct List_Stores {
GSList * list_store_master;
GSList * list_store_temporary;
List_Builder_Struct * list_builder_struct;
} List_Store_Struct;
我在函数中声明结构。
List_Store_Struct list_store_struct;
此结构通过引用传递给在框中制作按钮的函数。
GtkWidget *accounts_buttons_hbox = make_buttons(&list_store_struct);
在make_buttons 内部我使用连接信号
g_signal_connect(button, "clicked", G_CALLBACK(revert), list_store_struct);
函数revert内部我要检查结构的内容。
static void revert(GtkWidget* widget, gpointer data) {
List_Store_Struct* list_store_struct = (List_Store_Struct *) data;
/* The following lines point to nothing or give the debugger message Cannot access memory at address 0xblahblah */
GtkListStore * list_store = (list_store_struct->list_builder_struct)->list_store;
GSList * list_store_master = list_store_struct->list_store_master;
GSList * list_store_temporary = list_store_struct->list_store_temporary;
}
调试器显示指针list_store_struct指向一个空的内存位置;我无法访问该结构的成员。此外,尝试访问结构的成员会导致分段错误。
将此结构传递给回调以便我可以访问结构的成员的正确方法是什么?
【问题讨论】:
-
GSList *list_store_master;和GSList *list_store_temporary;和List_Builder_Struct *list_builder_struct;在哪里初始化?目前,成员只是未初始化的指针。 (避免'*'和"->"后面的空格) -
这些成员在
struct声明之前不久被初始化。我在连接信号的地方看到了结构的内容;我在回调中丢失了它们。 -
如果在您填写
GtkWidget *accounts_buttons_hbox = make_buttons(&list_store_struct);后,列表被填充,但是当您按下按钮并且"clicked"信号触发revert()回调时,您的列表消失了——那么您可能有一个堆栈代码中的粉碎问题未显示。因为您的信号和revert()函数看起来不错。由于List_Store_Struct list_store_struct;在堆栈上创建结构,因此如果发生任何堆栈粉碎(例如数组溢出或调用未定义行为破坏堆栈的类似问题),它将被破坏 -
很好的建议,听起来很正确。 TBH 我对 GTK 中的引用计数器和其他内存分配方案并不完全清楚,所以我可能需要理顺这些。谢谢。