0
struct ifaddrs {
    struct ifaddrs  *ifa_next;
    char        *ifa_name;
    unsigned int     ifa_flags;
    struct sockaddr *ifa_addr;
    struct sockaddr *ifa_netmask;
    struct sockaddr *ifa_dstaddr;
    void        *ifa_data;
}; 


struct ifaddrs *addrs,*tmp;

if(getifaddrs(&addrs) != 0) {
    perror("getifaddrs");
    return 1;
}

for(tmp = addrs; tmp ; tmp = tmp->ifa_next) {

}

我已经看到了getifaddrs获取结果的代码ifaddrs。但是迭代

for 循环正在遍历它可以找到的所有接口。

for(tmp = addrs; tmp ; tmp = tmp->ifa_next) {

}

问题是我看不到tmp->ifa_next指针如何增加或转到下一个链接。

4

1 回答 1

1

意思是 while tmpis not NULL(有值),设置为tmp等于tmp->next. 所以考虑每个循环。下面显示了每次迭代会发生什么。

tmp = addrs;
tmp = tmp->next; ( tmp->next is equal to addrs->next)
tmp = tmp->next; ( tmp->next is equal to addrs->next->next because tmp is equal to addrs->next)

ETC...

最终,tmp->nextisNULL并设置tmpNULL,此时退出循环。

为了进一步得出这个类比(我花了很长时间才知道链表是​​如何工作的):

1如果我们有一个 { , 2, 3, }的链表NULL,在这个集合上使用上面的循环。下面是伪代码,以提供更好的想法。

tmp = 1;
tmp = tmp->next; // 1->next = 2, so tmp = 2
tmp = tmp->next; // 2->next = 3, so tmp = 3
tmp = tmp->next; // 3->next = null, so tmp = null
exit
于 2013-09-27T19:51:23.393 回答