C语言 遍历 ifaddr 的链表


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) {
}

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

for 循环正在它能找到的所有接口中切换。

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

问题是我没有看到指针如何递增或转到下一个链接tmp->ifa_next

它说虽然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

相关内容

  • 没有找到相关文章

最新更新