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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将数组传递给函数 - 不同的值 - 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[]);

在进入w之前测试runner数组的值,而在其中显示它们(值)是不同的。我需要他们是一样的。我怎样才能实现这一点,为什么它们不相同?此外,发生了段错误。


I created a small program that is bare bones of the original one and that is supposed to recreate the conditions such that the problem occurs. Oddly enough, it runs fine.
#include <gtk/gtk.h>

void carry(gpointer root, gpointer a[])
{
        g_print("
");                                                              
        g_print("%d
", root);
        g_print("%d
", a[0]);                                                      
        g_print("%d
", a[1]);
        g_print("%d
", 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	%d
", menu_item, abc[0]);
        menu_item = gtk_menu_item_new();
        abc[1] = menu_item;
        g_print("%d	%d
", menu_item, abc[1]);                                     
        buffer = gtk_text_buffer_new(NULL);                                         
        abc[2] = buffer;                                                            
        g_print("%d	%d
", 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;
}

这意味着其他问题。我现在会尝试别的东西,比如评论线条,只留下相关的线条。


I didn't comment any lines yet, but I tried putting g_print in both the caller and the callee.

这是一个输出:

1162863440  1162863440
1162864736  1162864736
1163320992  1163320992

1162863440
-2
1162668992
973486176

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

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

答案

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

这一切只能意味着一件事:g_signal_connect正在弄乱我的价值观。它出于某种未知原因改变它们。

我想我必须使用结构。

另一答案

你不应该到处使用gpointers。 gpointer是一个void *,所以你几乎禁用编译器可以为你做的所有类型检查。使用GtkWidget *代替,并使用G_OBJECT()GTK_TEXT_BUFFER()等宏进行适当的演员表。

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

void
user_function (GtkMenuItem *menuitem,
               gpointer     user_data)

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

如果您有段错误,那么只需使用调试器来检查问题所在。

以上是关于将数组传递给函数 - 不同的值 - Segfault的主要内容,如果未能解决你的问题,请参考以下文章

使用 CreateThreadpoolWork/SubmitThreadpoolWork 时将不同的值传递给回调函数

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

如何将道具传递给来自不同来源的组件?

指针数组内容在传递给 C 中的函数时被擦除

将二维数组索引传递给函数?

尝试在其线程函数参数中将不同的值传递给 openMp 线程