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

C 将数组传递给函数-不同的值-Segfault,c,segmentation-fault,gtk,C,Segmentation Fault,Gtk,我有以下代码: 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], "

我有以下代码:

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
数组的值,并在其中进行测试,结果表明它们(值)不同。我需要它们是一样的。我如何才能做到这一点,为什么它们不相同?此外,也会发生segfault。
我创建了一个小程序,它是原始程序的基础,应该是重新创建问题发生的条件。奇怪的是,它运行良好

#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\u print(“%d\t%d\n”,菜单项,abc[0]);
的意义上,来自上面的代码)。如您所见,所有内容都已正确分配。在新行之后,我们检查被调用方中的相同值<第一个参数code>root,始终具有正确的值。所以这没问题<被调用方中的code>abc[0]值始终为-2。说真的,每次我运行程序都是-2。另外两个(
abc[1]
abc[2]
)总是有一些垃圾随机值,但它们在每次我运行程序时都会改变,这与
abc[0]
不同


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

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

这一切只能意味着一件事:
g\u signal\u connect
扰乱了我的价值观。它会因为一些未知的原因而改变它们


我想我必须使用struct。

你不应该到处使用
gpointer
s。
gpointer
是一个
void*
,因此您几乎禁用了编译器可以为您执行的所有类型检查。改为使用
GtkWidget*
,并使用
G_OBJECT()
GTK_TEXT_BUFFER()
等宏执行正确的强制转换

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

void
user_function (GtkMenuItem *menuitem,
               gpointer     user_data)
如果要在用户数据字段中传递多个项,请传递一个指针或指向结构的指针,而不是指针数组


如果你有一个segfault,那么就用一个调试器来检查问题出在哪里。

w[2]=buffer但是缓冲区未初始化。@Jean-Françoisfare哦,是的,我忘了添加那个。不过,这并不能解决问题。这里没有足够的资源来重现这个问题。你在调试器中找到可能的原因了吗?@tadman所以一切看起来都很好,嗯?我想是的。我只包含了我认为与问题相关的信息。很不幸,我对调试器不是很在行。我的意思是,我可以调试CLI程序,但不能调试GUI程序(“因为当GUI启动时,我会失去调试器中的控制权,只有在GUI终止时才能恢复控制权”)。您(或其他任何人)是否知道导致此问题的原因?请告诉我,我将把它包括在问题中,但我不能像那样包括它,因为我一生都无法在我的代码中找到任何可疑的东西。如果你正在调试GUI应用程序,只需在出现问题前一两行删除一个断点。当执行到达断点时,它将把控制权交还给调试器,在调试器处可以检查变量、单步等。
void
user_function (GtkMenuItem *menuitem,
               gpointer     user_data)