[問題] GTK+ widget 陣列與記憶體配置

看板C_and_CPP作者 (致中和)時間14年前 (2011/05/31 01:50), 編輯推噓3(304)
留言7則, 4人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Ubuntu with gcc 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) GTK+ 2.x 問題(Question): 我宣告了一個 GtkWidget 型態的指標, 並且使用, g_malloc 函式給它一個記憶體空間, 結果發現記憶體配置與預期的不符。 導致將陣列的指標傳回 callback function 後,會讀到錯誤的資訊。 餵入的資料(Input): /* sizeof(GtkWidget) = 0x3C; */ GtkWidget* button[3][3]; button[0][0] = (GtkWidget*)g_malloc( sizeof(GtkWidget) * 3 * 3 ); 預期的正確結果(Expected Output): /* 傳進 callback function 後似乎不能用陣列形式,所以改成這樣 */ button + 0*3 + 0 = 0x97da040 button + 0*3 + 1 = 0x97da07c button + 0*3 + 2 = 0x97da0b8 ... 錯誤結果(Wrong Output): /* 在 main function 裡 */ button[0][0] = 0x97da040 button[0][1] = 0x97da140 button[0][2] = 0x97da240 ... 程式碼(Code):(請善用置底文網頁, 記得排版) void ButtonCallBack( GtkWidget button, gpointer data ); int main(int argc, char* argv[]) { GtkWidget* button[3][3]; button[0][0] = (GtkWidget*)g_malloc( sizeof(GtkWidget) * 3 * 3 ); ... printf("toggle_button[%i][%i] = %p\n", 1, 2, toggle_button[1][2] ); ... g_signal_connect(GTK_OBJECT( button[1][2] ), "clicked", GTK_SIGNAL_FUNC( ButtonCallBack ), (gpointer)button[0][0]); ... } void ButtonCallBack( GtkWidget button, gpointer data ) { printf("(GtkWidget*)data + %i*%i+%i = %p\n", 1, 3, 2, (GtkWidget*)data + 1 * NODE + 2 ); } /*-------------------------* * 感謝! * *-------------------------*/ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.64.139.139 VElysian:轉錄至看板 LinuxDev 05/31 01:51 ※ 編輯: VElysian 來自: 61.64.139.139 (05/31 01:55)

05/31 02:13, , 1F
我想問為什麼不是 cast 成 GtkWidget * ?
05/31 02:13, 1F

05/31 02:18, , 2F
說 malloc 那個嗎?忘記加抱歉 >_<"
05/31 02:18, 2F
※ 編輯: VElysian 來自: 61.64.139.139 (05/31 02:18)

05/31 02:21, , 3F
還是不對吧, buttons[0][0] 是 GtkWidget *
05/31 02:21, 3F

05/31 02:22, , 4F
那應該要是 sizeof( GtkWidget * ) 3x3 個指標大小
05/31 02:22, 4F

05/31 08:44, , 5F
用for迴圈跑 gtk_widget_new 不好嗎 @@?
05/31 08:44, 5F

05/31 08:49, , 6F
因為malloc出來的空間不一定是連續的,即使是gcc 不同版
05/31 08:49, 6F

05/31 08:50, , 7F
為了優化速度,也有不同做法
05/31 08:50, 7F
文章代碼(AID): #1DuzZJ3h (C_and_CPP)