Pointers C代码中的指针赋值问题 int rtadd(IPADR网络、IPADR掩码、IPADR gw、无符号度量) { 结构路线*prt、*srt、*prev; srt=malloc(sizeof(struct-route)); bool-isdup; int-hv=0,i=0; 如果(!Route.ri_有效) rtinit(); prt=rtnew(净、屏蔽、gw、公制); prt->rt_键=0; 对于(i-0;irt_键+=(掩码>>i)&1; prev=NULL; hv=Rhash(净); isdup=false; 对于(srt=rttable[hv];srt;srt=srt->rt\U next)//故障点(srt=rttable[hv]的问题)? { 如果(prt->rt\U键>srt->rt\U键) { 打破 } 如果(srt->rt\u net==prt->rt\u net&&srt->rt\u mask==prt->rt\u mask) { isdup=true; 打破 } prev=srt; } 返回0; }

Pointers C代码中的指针赋值问题 int rtadd(IPADR网络、IPADR掩码、IPADR gw、无符号度量) { 结构路线*prt、*srt、*prev; srt=malloc(sizeof(struct-route)); bool-isdup; int-hv=0,i=0; 如果(!Route.ri_有效) rtinit(); prt=rtnew(净、屏蔽、gw、公制); prt->rt_键=0; 对于(i-0;irt_键+=(掩码>>i)&1; prev=NULL; hv=Rhash(净); isdup=false; 对于(srt=rttable[hv];srt;srt=srt->rt\U next)//故障点(srt=rttable[hv]的问题)? { 如果(prt->rt\U键>srt->rt\U键) { 打破 } 如果(srt->rt\u net==prt->rt\u net&&srt->rt\u mask==prt->rt\u mask) { isdup=true; 打破 } prev=srt; } 返回0; },pointers,networking,null,malloc,assign,Pointers,Networking,Null,Malloc,Assign,在上面的代码中,我创建了一个指针srt,并使用malloc命令对其进行初始化。当我将其分配给数组rttable时,该数组被声明为struct route*rttable[RT_TSIZE],则srt指针变为空。这可能是什么原因造成的 在我的网络课程中,正在为一个项目编写的代码基于Douglas Comer的TCP/IP第二卷书: malloc现在是内存泄漏,因为您没有实际使用分配的内存地址。在for循环中,通过将src指针指向rttable[hv],将其重新分配到内存中的不同位置。因此,如果您检

在上面的代码中,我创建了一个指针
srt
,并使用
malloc
命令对其进行初始化。当我将其分配给数组rttable时,该数组被声明为
struct route*rttable[RT_TSIZE]
,则
srt
指针变为空。这可能是什么原因造成的

在我的网络课程中,正在为一个项目编写的代码基于Douglas Comer的TCP/IP第二卷书:


malloc现在是内存泄漏,因为您没有实际使用分配的内存地址。在for循环中,通过将src指针指向rttable[hv],将其重新分配到内存中的不同位置。因此,如果您检查rttable[hv],您很可能会发现它的值设置为0或null。

srt->rt\u next
(分配给
srt
)最终可能会变为null。请看,我也这么认为,除了测试之后,
srt
指针在直接分配给
rttable[hv]后会变为null
那么
rttable[hv]
是空的……我不这样认为,因为我在这里初始化rttable
void rtinit(void){int I;for(I=0;I
您初始化
rttable
,但是您没有初始化
rttable[hv]
(现在您发布了代码,实际上,您显式地将所有项目初始化为
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;
}