ping命令里定义的struct proto:struct proto {void (*fproc)(char *, ssize_t, struct timeval *);void (*fsend)(void);struct sockaddr *sasend; /* sockaddr{} for send, from getaddrinfo */struct sockaddr *sarecv; /* sockaddr{} for receiving */socklen_t salen; /* length of sockaddr{}s */int icmpproto; /* IPPROTO_xxx value for ICMP */} *pr;有:struct proto proto_v4 = { proc_v4, send_v4, NULL, NULL, 0, IPPROTO_ICMP };其中的proc_v4,send_v4都是函数,pro定义如下:void proc_v4(char *ptr, ssize_t len, struct timeval *tvrecv);void send_v4(void);具体函数内部定义就不贴了,没什么关系。我的问题是:在proto_v4 = { proc_v4, send_v4, NULL, NULL, 0, IPPROTO_ICMP }中,proc_v4函数怎么传参?整个ping源码里面没有其他地方调用到proc_v4了,只有在proto_v4里调用了,他传进去的是函数的是函数地址还是函数返回值的地址?而且struct proto_v4怎么可以直接用‘=‘呢?求高手帮忙解答,谢谢!那还有proc_v4这个函数需要参数,怎么把参数传进去呢?
2 回答
噜噜哒
TA贡献1784条经验 获得超7个赞
可以使用,相当与函数地址作为一个常量值赋值给结构体变量函数
proto_v4 = { proc_v4, send_v4, NULL, NULL, 0, IPPROTO_ICMP };
等同于:
proto_v4 = { &proc_v4, &send_v4, NULL, NULL, 0, IPPROTO_ICMP }
即取函数地址指针。
犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
fproc是函数指针,指向函数的入口地址。
标准写法是proto_v4.fproc = &proc_v4;
可以简写为proto_v4.fproc = proc_v4;
编译器都认识。
用函数指针通常可以封装某些内部信息,参数可以通过消息传递。
可能的一种调用形式为:
void process(struct proto *p,u32 msg[4])
{
char *s = (char*)msg[0];
ssize_t *sz = (ssize_t*)msg[1];
struct timeval *tv = (struct timeval*)msg[2];
p->fproc(s,*sz,tv);
}
结构体初始化用=有什么问题吗?
添加回答
举报
0/150
提交
取消
