2013-06-11 63 views
0

我有以下问题。 当我这样传递一个gpointer的形式定义为char id_rest[25];一个char参数在g_signal_connect功能:char *在gpointer中发送一个奇怪的编码字符串

g_signal_connect (G_OBJECT (button_pas_save), "clicked", G_CALLBACK (save), (gpointer) id_rest); 

当我在回调函数,在这种情况下是save我得到什么看起来像一个printf它字符串以不同的编码方式。例如,当我通过AAA时,我得到

我试过用char*指针和malloc它没有改变。但什么是平板,而不是传递一个变量时,我只传递一个字符串在""之间工作正常。例如:

g_signal_connect (G_OBJECT (button_pas_save), "clicked", G_CALLBACK (save), (gpointer) "AAA"); 

给我发送AAA

这是我在save回调的printf:

printf("%s\n", (char*) id); 

而且idgpointer说法。 我也试过用gchar而不是char,它也没有改变任何东西。

我出来的想法。请帮忙。

编辑:

灌装变量被称为get_id不同的函数来完成,在这里你可以看到我测试这个行动,printf,结果是好的,它发送的东西后回调真的奇怪。

get_id(con, selection, "pass", id_rest); 
    printf("%s\n", id_rest); 
+1

将'id_rest'设为全局变量会发生什么? – jxh

+0

那么它似乎工作正常,为什么? – Marek

+1

这意味着@J_D可能是对的。堆栈变量已超出范围,因此您的回调会打印无效内存。 – jxh

回答

1

id_rest存储在堆栈上吗?当回调被调用时,它可能已经超出了范围,也许g_signal_connect不会复制它,而只是存储一个指向它的指针。

编辑

通过重读的问题,我注意到你也尝试过使用malloc从堆中分配,因此它似乎并没有因为阵列已超出范围(除非你叫free在回调被调用之前)

+0

没问题。无论如何感谢您的反馈。 – Marek