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