c - 遍历ifaddr的链表

标签 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 循环正在遍历它能找到的所有接口(interface)。

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,此时循环已退出。

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

如果我们有一个 { 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

关于c - 遍历ifaddr的链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19058897/

相关文章:

c - 如何仅使用两个指针反转单链表?

c - 我需要从 c 中的列表中删除相同的元素

c - 递归地反向链接列表

c - 我将如何在这里应用余数/模运算符?

java - 如何验证我的 Java 代码是否确实发送了 POST 请求?

c - 为什么 make 打印 "make: Nothing to be done for ` all'."?

linux - 如何从 perl 进行经过身份验证的 https 访问

android - 如何从 Android AlarmManager 回调执行网络 Activity

C - 跨多个文件返回结构指针时出错

c - 在c中使用指针解释二维数组