2013-09-27 54 views
0
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) { 

} 

我已經看到​​的這段代碼在ifaddrs中得到結果。但迭代for循環遍佈它可以找到的所有接口。迭代ifaddr的鏈表

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

} 

的問題是我不知道tmp->ifa_next指針如何增加或去到下一個環節。

+1

它不會遞增,它只是每次迭代時的另一個指針。嘗試添加'fprintf(stderr,「%p - >%p \ n」,tmp,tmp-> ifa_next);'在循環體內部,你會看到。 – wildplasser

+1

由於'tmp = tmp-> ifa_next' –

+2

順便說一句:沒有涉及到雙向鏈表。你對指針指針感到困惑嗎? – wildplasser

回答

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