【问题标题】:Pointer Assignment Issue in C codeC代码中的指针分配问题
【发布时间】:2017-01-31 21:38:32
【问题描述】:
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 命令对其进行初始化。当我将它分配给声明为struct route *rttable[RT_TSIZE]; 的数组rttable 时,srt 指针变为NULL。这可能是什么原因造成的?

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

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

【问题讨论】:

  • srt-&gt;rt_next(分配给srt)最终可能变为空。
  • 看到我也是这么想的,除了经过测试,srt指针直接赋值给rttable[hv]后变为NULL
  • 那么rttable[hv] 为空……
  • 我不这么认为,因为我在这里初始化 rttable void rtinit(void) { int i; for (i = 0; i &lt; RT_TSIZE; ++i) rttable[i] = 0; Route.ri_bpool = malloc(sizeof(struct route)); Route.ri_valid = true; Route.ri_default = NULL; }
  • 你初始化了rttable,但是你没有初始化rttable[hv](现在你贴出代码,其实你是显式初始化了所有的item为0)。

标签: pointers networking null malloc assign


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2013-10-13
    • 1970-01-01
    • 2021-06-03
    • 2018-09-30
    相关资源
    最近更新 更多