由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 一个C语言的面试题,有点乱,麻烦看一下
相关主题
C++ online Test 又一题 (转载)电话面试题一问 (转载)
A aimple C++ question请教C++ call-by-ref & call-by-val的问题
为什么foo1可以而foo2不行?出个题考考大家:)
const 指针类型转换请问一个exception题目
大侠们救命, C++ operator new 问题Use Visual .NET for C++ programming
在main()里面创建了几个线程,如何等待所有线程都结束?三个C syntax 弱问题
C 中的typedef 一问奇怪的问题:关于一个简单的malloc()小程序 (转载)
一个nested class的问题这个C++程序为什么不能运行
相关话题的讨论汇总
话题: callback话题: cb话题: fn话题: void话题: user
进入Programming版参与讨论
1 (共1页)
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))这个是怎么理解?

1 (共1页)
进入Programming版参与讨论
相关主题
这个C++程序为什么不能运行大侠们救命, C++ operator new 问题
一个读用户输入的小问题在main()里面创建了几个线程,如何等待所有线程都结束?
a question on C++ stringC 中的typedef 一问
定义的struct数组很大时,为什么会出现奇怪的大数字?一个nested class的问题
C++ online Test 又一题 (转载)电话面试题一问 (转载)
A aimple C++ question请教C++ call-by-ref & call-by-val的问题
为什么foo1可以而foo2不行?出个题考考大家:)
const 指针类型转换请问一个exception题目
相关话题的讨论汇总
话题: callback话题: cb话题: fn话题: void话题: user