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

时间:2018-09-06 21:45:30

标签: 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], "activate", G_CALLBACK(runner), w);

runner函数声明为:

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

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


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

#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]不同而改变。

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

您不应在各处使用gpointergpointervoid *,因此您几乎禁用了编译器可以为您完成的所有类型检查。改为使用GtkWidget *,并使用G_OBJECT()GTK_TEXT_BUFFER()等宏进行正确的转换。

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

void
user_function (GtkMenuItem *menuitem,
               gpointer     user_data)

如果您要在user-data字段中传递多个项目,请将指针或指针传递给结构而不是指针数组。

如果您有段错误,只需使用调试器检查问题出在哪里。