2013-06-11 64 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