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;
編譯器都認識。
用函數指針通??梢苑庋b某些內部信息,參數可以通過消息傳遞。
可能的一種調用形式為:
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
提交
取消