迭代ifaddr的链表

时间:2013-09-27 19:46:06

标签: c networking linked-list

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指针如何递增或转到下一个链接。

1 个答案:

答案 0 :(得分:1)

虽然tmp不是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)

等...

最终,tmp->nextNULL,并设置tmp等于NULL,此时退出循环。

进一步说明这个比喻(我花了很长时间才知道链接列表是如何工作的):

如果我们有{123NULL}的链接列表,请在此集合中使用上述循环。下面是伪代码,以提供更好的主意。

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