[問題] GTK+ widget 陣列與記憶體配置
※ [本文轉錄自 C_and_CPP 看板 #1DuzZJ3h ]
作者: VElysian (致中和) 看板: C_and_CPP
標題: [問題] GTK+ widget 陣列與記憶體配置
時間: Tue May 31 01:50:00 2011
開發平台(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
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.64.139.139
※ 編輯: VElysian 來自: 61.64.139.139 (05/31 01:55)
※ 編輯: VElysian 來自: 61.64.139.139 (05/31 02:19)
推
06/16 07:48, , 1F
06/16 07:48, 1F
→
07/29 01:49, , 2F
07/29 01:49, 2F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 2 篇):
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章