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
。
它说虽然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->next
被NULL
并设置tmp
等于NULL
,此时循环退出。
为了进一步得出这个类比(我花了很长时间才了解链表的工作原理):
如果我们有一个 { 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