【问题标题】:Valgrind Invalid readValgrind 无效读取
【发布时间】:2012-06-07 09:24:19
【问题描述】:

我在 valgrind 中遇到了几个错误,指的是我的代码的一部分。基本上我有一个充当队列的结构链接列表。这是我的入队函数:

PcbPtr enqPcb(PcbPtr *headofQ, PcbPtr process){
    PcbPtr c = *headofQ;
    PcbPtr d = c;
    if (!*headofQ) {
        *headofQ = process;
        return *headofQ;
    }
    while (c->next) {
        c = c->next;
    }
    c->next = process;
    return d;
}

PcbPtr 是一个指向结构的指针。 Valgrind 在 while 循环中给了我各种各样的东西“条件跳转或移动取决于未初始化的值”等。这有什么明显的错误,还是超出了我所包含的范围?谢谢

【问题讨论】:

  • 和你的问题无关,但是为什么要使用中间变量d,什么时候可以直接返回*headofQ呢?
  • 好问题。我认为这是一些调试的残余:)
  • @JoachimPileborg:你知道吗,我多次看到初级程序员使用这样的中间变量。我不知道为什么。许多初级程序员的心理中有些东西引发了这种情况:这很普遍。 (另一方面,OP 的风格似乎比较成熟,因此在他的案例中,中间体不太可能是事先修改代码的产物。)
  • 我认为错误很可能不在此代码中;很可能列表填充不正确。
  • 您是否使用--track-origins=yes 选项运行了valgrind?然后它应该会告诉你未初始化的内存来自哪里。

标签: c valgrind


【解决方案1】:

您可以考虑初始化process 所指的next 成员(如果在调用enqPcb() 之前尚未完成):

PcbPtr enqPcb(PcbPtr *headofQ, PcbPtr process){
  PcbPtr c = *headofQ;
  PcbPtr d = c;
  process->next = NULL;

  ...

【讨论】:

    猜你喜欢
    • 2018-07-07
    • 2017-04-09
    • 2015-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多