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]
是空的……我不这样认为,因为我在这里初始化rttablevoid 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;
}