将收到的参数传递给回调函数

时间:2019-12-24 21:44:25

标签: c function callback arguments gtk

我正在用C进行Gtk项目。

从main.c中,我调用一个以内部地址作为参数的 function1

在该 function1 中,我可以访问该第一个值,但是在该 function1 的末尾(内部),我调用另一个 function2 (这是click事件的回调函数),并将我从 function1 参数获得的地址传递给它。

但是在 function2 中,地址已更改,绝对无法弄清为什么 ...

我的项目如下:

[main.c]

int main(...) {

    int a = 50;
    function1(&a);

}

[function1.c]

void function1(int* nb) {
    ...
    g_signal_connect(G_OBJECT(button),"clicked", G_CALLBACK(function2), &nb);
    // I know that the 4th arg expects void*, but even though I give the address of that _nb_ parameter, still can't get that 50 in function2
}

[function2.c]

void function2(void* nb) {
    ...
    printf("should got 50 : %d ", *(int*)nb);
    // shows random 8 digits number like 60035152
}

编辑:忘记提及每个函数都在单独的文件中,只要执行包含并给出原型,我就不知道这是否重要...

提前谢谢...

2 个答案:

答案 0 :(得分:0)

您有两个问题:

首先,您要传递一个局部变量的地址,但是在函数返回后不能使用它。

第二,function2期望nb是指向int的指针,但是您正在将指向int的指针传递给g_signal_connect()

void function1(int* nb) {
    ...
    int *nb_copy = malloc(sizeof(int));
    *nb_copy = *nb;
    g_signal_connect(G_OBJECT(button),"clicked", G_CALLBACK(function2), nb_copy);
    // I know that the 4th arg expects void*, but even though I give the address of that _nb_ parameter, still can't get that 50 in function2
}

function_2()完成后应该free(nb);,以防止内存泄漏。

答案 1 :(得分:0)

问题出在您的代码中:-

1)您正在将变量的地址传递给回调函数     因此应该是nb,而不是&nb。

2)这是点击信号的回调函数(https://developer.gnome.org/gtk3/stable/GtkButton.html#GtkButton-clicked_

void
user_function (GtkButton *button,
               gpointer   user_data)

您在回调函数中缺少参数