繁体   English   中英

将数组传递给函数-不同的值-Segfault

[英]Passing an array to a function - Different values - Segfault

我有以下代码:

gpointer w[3];
GtkWidget *menu_item = gtk_menu_item_new();
w[0] = menu_item;
menu_item = gtk_menu_item_new();
w[1] = menu_item;
GtkTextBuffer *buffer = gtk_text_buffer_new(NULL);
w[2] = buffer;

到目前为止,一切都很好。 现在连接一个信号:

g_signal_connect(w[0], "activate", G_CALLBACK(runner), w);

runner函数声明为:

void runner(gpointer root, gpointer w[]);

在输入runner之前测试w数组的值,在其中输入w数组的值表明它们(值)不同。 我需要他们是一样的。 我该如何做到?为什么它们不相同? 此外,发生段故障。


我创建了一个小程序,它是原始程序的基本内容,应该重新创建导致问题发生的条件。 奇怪的是,它运行良好。

 #include <gtk/gtk.h> void carry(gpointer root, gpointer a[]) { g_print("\\n"); g_print("%d\\n", root); g_print("%d\\n", a[0]); g_print("%d\\n", a[1]); g_print("%d\\n", a[2]); } int main(int argc, char **argv) { gtk_init(&argc, &argv); GtkWidget *menu_item; GtkTextBuffer *buffer; gpointer abc[3]; menu_item = gtk_menu_item_new(); abc[0] = menu_item; g_print("%d\\t%d\\n", menu_item, abc[0]); menu_item = gtk_menu_item_new(); abc[1] = menu_item; g_print("%d\\t%d\\n", menu_item, abc[1]); buffer = gtk_text_buffer_new(NULL); abc[2] = buffer; g_print("%d\\t%d\\n", buffer, abc[2]); g_signal_connect(abc[2], "modified-changed", G_CALLBACK(carry), abc); gtk_text_buffer_set_modified(abc[2], TRUE); gtk_main(); return 0; } 

这意味着还有其他问题。 我现在将尝试其他操作,例如注释行并仅保留相关行。


我还没有注释任何行,但是我尝试将g_print放在调用方和被调用方中。

这是一个输出:

 1162863440 1162863440 1162864736 1162864736 1163320992 1163320992 1162863440 -2 1162668992 973486176 

前三行将原始值与其在数组中的副本进行比较(根据上面的代码,在g_print("%d\\t%d\\n", menu_item, abc[0]);的意义上)。 如您所见,一切都已正确分配。 换一行后,我们在被叫方中检查那些相同的值。 第一个参数root始终具有正确的值。 因此,这没有问题。 被调用方中的abc[0]的值始终-2 认真地说,每次我运行该程序都为-2 其他两个( abc[1]abc[2] )总是具有一些垃圾随机值,但每次我运行程序时它们都会改变,这与abc[0]

我希望这将有助于诊断和解决问题。

我尝试通过函数( func(arg0, arg1, ...)而不是使用g_signal_connect() )正常传递abc[0]abc func(arg0, arg1, ...)并且没有任何问题

这一切仅意味着一件事: g_signal_connect弄乱了我的价​​值观。 它出于某些未知原因而更改了它们。

我想我必须使用一个结构。

您不应该在所有地方都使用gpointer gpointer是一个void * ,因此您几乎禁用了所有类型检查编译器可以为您做的检查。 请改用GtkWidget * ,并使用G_OBJECT()GTK_TEXT_BUFFER()等宏进行正确的转换。

您还应该使用类型化的回调参数,因为它们出现在每个信号的文档中。 例如activate信号:

void
user_function (GtkMenuItem *menuitem,
               gpointer     user_data)

并且,如果要在用户数据字段中传递多个项目,请将指针或指针传递给结构而不是指针数组。

而且,如果您遇到段故障,只需使用调试器来检查问题出在哪里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM