g***i 发帖数: 4272 | 1 #include
#include
typedef void (*callback_fn_t)(void*);
typedef struct cb_st{
void *user_data;
callback_fn_t user_fn;
}callback_t;
void do_callback(const callback_t *cb){
((callback_fn_t) cb)(cb->user_data);//这里会出错
}
void my_cb(void *data){
printf("Hello, %s!\n", (char*)data);
}
int main(int argc, const char * argv[])
{
callback_t cb;
cb.user_data = (void *)"Stephen";
cb.user_fn = &my_cb;
do_callback(&cb);
return 0;
}
请问出错的原因是什么?
是不是不能把cb cast为callback_fn_t? |
h*******s 发帖数: 8454 | 2 改成
(cb->user_fn)(cb->user_data);
试试
【在 g***i 的大作中提到】 : #include : #include : typedef void (*callback_fn_t)(void*); : typedef struct cb_st{ : void *user_data; : callback_fn_t user_fn; : }callback_t; : void do_callback(const callback_t *cb){ : ((callback_fn_t) cb)(cb->user_data);//这里会出错 : }
|
g***i 发帖数: 4272 | 3 恩我也刚这么改了,就可以。
这样的话原因应该就是那个指针cast错误吧?
【在 h*******s 的大作中提到】 : 改成 : (cb->user_fn)(cb->user_data); : 试试
|
h*******s 发帖数: 8454 | 4 你原来想干的事儿是这样?
typedef struct cb_st{
callback_fn_t user_fn;
void *user_data;
}callback_t;
void do_callback(const callback_t *cb){
(*((callback_fn_t*) cb))(cb->user_data);
}
【在 g***i 的大作中提到】 : 恩我也刚这么改了,就可以。 : 这样的话原因应该就是那个指针cast错误吧?
|
g***i 发帖数: 4272 | 5 这code不是我写的,就是这样让我指出错误原因。
(*((callback_fn_t*) cb))这个是怎么理解?
【在 h*******s 的大作中提到】 : 你原来想干的事儿是这样? : typedef struct cb_st{ : callback_fn_t user_fn; : void *user_data; : }callback_t; : void do_callback(const callback_t *cb){ : (*((callback_fn_t*) cb))(cb->user_data); : }
|
h***o 发帖数: 30 | 6 假设在main中
cb = {user_fn = 0x80484bb, user_data = 0xb7fccff4}
&cb = 0xffff3c8
在do_callback中
cb = 0xffff3c8 (参数是地址!)
callback_fn_t* fptr = (callback_fn_t*) cb = 0xffff3c8
*fptr = *cb = 0x80484bb
调用(*fptr)(user_data)是对的 因为(*fptr)就是user_fn的地址
但是另外一种cast
callback_fn_t f = (callback_fn_t) cb = 0xffff3c8
调用f(data)是错的 因为f不是某个函数的地址.
【在 g***i 的大作中提到】 : 这code不是我写的,就是这样让我指出错误原因。 : (*((callback_fn_t*) cb))这个是怎么理解?
|