2017-01-31 11 views
0
int rtadd(IPaddr net, IPaddr mask, IPaddr gw, unsigned metric) 
{ 
    struct route *prt, *srt, *prev; 
    srt= malloc(sizeof(struct route)); 
    bool isdup; 
    int hv = 0, i = 0; 

    if (!Route.ri_valid) 
     rtinit(); 

    prt = rtnew(net, mask, gw, metric); 

    prt->rt_key = 0; 
    for (i - 0; i < 32; ++i) 
     prt->rt_key += (mask >> i) & 1; 

    prev = NULL; 
    hv = rthash(net); 
    isdup = false; 
    for (srt = rttable[hv]; srt; srt = srt->rt_next) //trouble point (issue with srt = rttable[hv])? 
    { 
     if (prt->rt_key > srt->rt_key) 
     { 
      break; 
     } 
     if (srt->rt_net == prt->rt_net && srt->rt_mask == prt->rt_mask) 
     { 
      isdup = true; 
      break; 
     } 
     prev = srt; 
    } 

    return 0; 
} 

В приведенном выше коде я создал указатель srt и использовал команду malloc для его инициализации. Когда я назначаю его массиву rttable, который объявлен как struct route *rttable[RT_TSIZE];, указатель srt становится NULL. Что может быть причиной этого?Указатель Назначение Выпуск в C код

Код, который делается для проекта в моем сетевом классе базируется на TCP/IP тома II книге Дугласа встречному в:

https://www.amazon.com/Internetworking-TCP-Vol-Implementation-Internals/dp/0139738436

+0

'srt-> rt_next' (который присваивается' srt') в конечном итоге становится нулевым, возможно. – rom1v

+0

См. Также я думал об этом, кроме как после тестирования, указатель 'srt' становится NULL после прямого присвоения ему' rttable [hv] ' – Wakester

+0

Тогда' rttable [hv] 'is null ... – rom1v

ответ

1

таНос теперь утечка памяти, так как вы не фактически используя выделенный адрес памяти. В цикле for вы перенаправляете указатель src в другое место в памяти, указывая его на rttable [hv]. Итак, если вы проверили rttable [hv], вы, скорее всего, найдете значение, равное 0 или null.