我试着找到一个类似的问题,但找不到任何解决办法。
我有一个使用GTK3用C编写的软件,我正试图在我的GUI上设置一个回调按钮。代码应该传递一个整数作为参数,让回调函数知道要引用哪个GUI窗口。

void main_gui()
{
    int number = 5;

    g_signal_connect(button,
                    "clicked",
                    G_CALLBACK(callback_func),
                    (gpointer*) &num);
}

void callback_func(gpointer *data)
{
    int number;
    number = (int*)data;
    printf("Number: %d\n", number);
}

问题是每当我试图将数字转换为整数并检查数字(通过print语句)时,它返回的数字不正确。

最佳答案

首先,这个函数实际上需要一个gpointer*还是一个gpointer?后者似乎更有可能,因为gpointer是一个void *
其次,传递的是局部变量的地址而不是其值。别那么做。本地变量在堆栈上,一旦函数退出(在调用回调之前发生),就可能不存在。只需将值转换为所需类型:&number然后当您要使用它时,将其转换回:(gpointer)number
下面是更新的代码:

void main_gui()
{
    int number = 5;

    g_signal_connect(button,
                    "clicked",
                    G_CALLBACK(callback_func),
                    //(gpointer*) &num);
                    (gpointer)number);
}

//void callback_func(gpointer *data)
void callback_func(gpointer data)
{
    int number;
    //number = (int*)data;
    number = (int)data;

    printf("Number: %d\n", number);
}

关于c - 在g_signal_connect中将整数作为gpointer传递,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55749456/

10-11 19:33