免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4182 | 回复: 11
打印 上一主题 下一主题

struct 指针问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-22 14:29 |只看该作者 |倒序浏览
void wsc_supplicant_rx(void *ctx, const u8 *src_addr, const u8 *buf, size_t len)
{。。。。
struct wsc_drv *wsc_drv = (struct wsc_drv *) ctx;
。。。。

等号左边是定义一个指向wsc_drv类型结构体的指针变量wsc_drv;那么等号右边是什么意思??

论坛徽章:
5
2 [报告]
发表于 2009-04-22 14:32 |只看该作者
原帖由 todayrw 于 2009/4/22 14:29 发表
void wsc_supplicant_rx(void *ctx, const u8 *src_addr, const u8 *buf, size_t len)
{。。。。
struct wsc_drv *wsc_drv = (struct wsc_drv *) ctx;
。。。。

等号左边是定义一个指向wsc_drv类型结构体 ...


ctx定义void指针, 强制转化指向struct wsc_drv

论坛徽章:
0
3 [报告]
发表于 2009-04-22 14:35 |只看该作者

回复 #2 yidou 的帖子

那么强化指向的struct wsc_drv有具体地址吗?

论坛徽章:
5
4 [报告]
发表于 2009-04-22 14:37 |只看该作者
原帖由 todayrw 于 2009/4/22 14:35 发表
那么强化指向的struct wsc_drv有具体地址吗?


地址值就是ctx

论坛徽章:
0
5 [报告]
发表于 2009-04-22 14:42 |只看该作者

回复 #4 yidou 的帖子

谢谢!
再问一下,我查看wsc_supplicant_rx函数的被调用处:
wsc_drv->l2 = l2_packet_init(wsc_drv->ifname, wpa_drv_get_mac_addr(wsc_drv),
                            ETH_P_EAPOL, wsc_supplicant_rx, wsc_drv, 0);

这里调用的wsc_supplicant_rx为何没有带参数?是不是表示函数wsc_supplicant_rx的函数地址?

[ 本帖最后由 todayrw 于 2009-4-22 14:45 编辑 ]

论坛徽章:
5
6 [报告]
发表于 2009-04-22 15:36 |只看该作者
原帖由 todayrw 于 2009/4/22 14:42 发表
谢谢!
再问一下,我查看wsc_supplicant_rx函数的被调用处:
wsc_drv->l2 = l2_packet_init(wsc_drv->ifname, wpa_drv_get_mac_addr(wsc_drv),
                            ETH_P_EAPOL, wsc_supplicant_rx ...


这里只调用了l2_packet_init,  把wsc_supplicant_rx当参数传入.
在l2_packet_init()内部, 才能知道是否调用了wsc_supplicant_rx().

估计只是把wsc_supplicant_rx赋成callback函数.

论坛徽章:
0
7 [报告]
发表于 2009-04-22 16:53 |只看该作者

回复 #6 yidou 的帖子

不好意思啊,还得问问清楚:
"把wsc_supplicant_rx赋成callback函数"是什么意思?


struct l2_packet_data * l2_packet_init(
        const char *ifname, const u8 *own_addr, unsigned short protocol,
        void (*rx_callback)(void *ctx, const u8 *src_addr,
                            const u8 *buf, size_t len),

        void *rx_callback_ctx, int l2_hdr)
{
        struct l2_packet_data *l2;
        struct ifreq ifr;
        struct sockaddr_ll ll;

        l2 = malloc(sizeof(struct l2_packet_data));
        if (l2 == NULL)
                return NULL;
        memset(l2, 0, sizeof(*l2));
        strncpy(l2->ifname, ifname, sizeof(l2->ifname));
        l2->rx_callback = rx_callback;
                ........
}

[ 本帖最后由 todayrw 于 2009-4-22 16:54 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-04-22 23:34 |只看该作者
也就是回调函数是wsc_supplicant_rx , LZ应该好好看看指针了, 内核里面太多这样的指针了

论坛徽章:
0
9 [报告]
发表于 2009-04-23 01:06 |只看该作者
建议lz仔细看看《c专家编程》绝对都明白了

论坛徽章:
0
10 [报告]
发表于 2009-04-23 09:23 |只看该作者
指针类型强制转换 , 建议看看c基础书籍
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP