I'm doing this callback on linux timer, but I don't know why the address changes when it was converted back on the callback function. Code below
typedef void* timer_cb_args;
typedef void (*timer_cb)(timer_cb_args);
struct cb_wrapper
{
    timer_cb callback;
    timer_cb_args args;
};
void callback_wrapper(union sigval sv)
{
    struct cb_wrapper *cb = (struct cb_wrapper*)(sv.sival_ptr);
    printf("Casted sival_ptr pointer on Callback wrapper: %p\n\n", cb);
    printf("Callback wrapper function pointer: %p\n", cb->callback);
    printf("Callback wrapper args pointer: %p\n\n", &cb->args);
    cb->callback(cb->args);
}
int timer_start(timer_handle_t *timer_handle,
                           timer_cb callback,
                           timer_cb_args args,
                           guint32 duration)
{
    int ret = 0;
    timer_t *timer = calloc(1, sizeof(timer_t));
    *timer_handle = (timer_handle_t) calloc(1, sizeof(timer_handle_t));
    (*timer_handle)->m_timer = timer;
    struct sigevent evp;
    memset(&evp, 0, sizeof(struct sigevent));
    struct cb_wrapper cbargs;
    memset(&cbargs, 0, sizeof(struct cb_wrapper));
    cbargs.callback = callback;
    cbargs.args = args;
    evp.sigev_notify = SIGEV_THREAD;
    evp.sigev_notify_function = &callback_wrapper;
    evp.sigev_value.sival_ptr = &cbargs;
    printf("sival_ptr pointer on call: %p\n",  evp.sigev_value.sival_ptr);
    printf("Function pointer: %p\n", cbargs.callback);
    printf("Args pointer on call: %p\n\n", cbargs.args);
    int timer_result;
    timer_result = timer_create(CLOCK_REALTIME, &evp, timer);
    if (timer_result < 0)
        return -1;
    struct itimerspec timespec;
    memset(×pec, 0, sizeof(struct itimerspec));
    timespec.it_value.tv_sec = duration;
    timer_result = timer_settime(*timer, 0, ×pec, NULL);
    if (timer_result < 0)
        return -1;
    return ret;
}
output is:
sival_ptr pointer on call: 0x7ffce75c3950
Function pointer: 0x55f26d13abb4
Args pointer on call: 0x7ffce75c3a00
Callback wrapper.
Casted sival_ptr pointer on Callback wrapper: 0x7ffce75c3950 //OK same
Callback wrapper function pointer: 0x55f26d13abb4 //OK same
Callback wrapper args pointer: 0x7ffce75c3958 //NOK not same as above
 
     
    