作者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 = 0x97da
040
button + 0*3 + 1 = 0x97da
07c
button + 0*3 + 2 = 0x97da
0b8
...
错误结果(Wrong Output):
/* 在 main function 里 */
button[0][0] = 0x97da
040
button[0][1] = 0x97da
140
button[0][2] = 0x97da
240
...
程式码(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)
1F:推 legnaleurc:我想问为什麽不是 cast 成 GtkWidget * ? 05/31 02:13
2F:→ VElysian:说 malloc 那个吗?忘记加抱歉 >_<" 05/31 02:18
※ 编辑: VElysian 来自: 61.64.139.139 (05/31 02:18)
3F:推 legnaleurc:还是不对吧, buttons[0][0] 是 GtkWidget * 05/31 02:21
4F:→ legnaleurc:那应该要是 sizeof( GtkWidget * ) 3x3 个指标大小 05/31 02:22
5F:推 Bencrie:用for回圈跑 gtk_widget_new 不好吗 @@? 05/31 08:44
6F:→ angleevil:因为malloc出来的空间不一定是连续的,即使是gcc 不同版 05/31 08:49
7F:→ angleevil:为了优化速度,也有不同做法 05/31 08:50