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

} 

Я видел этот код getifaddrs получая результаты в ifaddrs. Но IterationИтерация через связанный список 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

BTW: нет двойного связанного списка. Вы смущены указателем на указатель? – 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, и в этот момент происходит выход из цикла.

Для дальнейшего вытягивать эту аналогию (это мне потребовалось много времени, чтобы получить, как работают связанные списки):

Если у нас есть связанный список {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 
Смежные вопросы