【问题标题】:Infinite loop while printing打印时无限循环
【发布时间】:2011-10-29 05:36:38
【问题描述】:

首先,我是 C 的新手,并且被扔进了一个我必须使用 C 的程序。现在我相信我的问题与指针有关,但是当我尝试打印列表时(以确保我以正确的顺序存储它,我的程序在第二次循环后崩溃。

这是我的插入函数,它以所需的最短时间插入,我相信它是正确的,但由于我的打印崩溃而无法对其进行测试

void insertProcess(Process& process, Process* &head, Process* curr, Process* prev){
curr = head;
if(head == NULL){
    head = &process;
}
else{
    prev = head;
    while(process.timeNeeded > curr->timeNeeded){
        prev = curr;
        curr = curr->next;
    }
    prev->next = &process;
    process.next = curr;
}
}

这是我应该打印列表的简单循环。这将在给出“访问冲突读取位置”之前运行几次

while(curr->next != NULL){
    printf("%s %i %i %i\n", process.processName, process.arrivalTime,     process.timeNeeded, process.priority);
    curr = curr->next;
}

我很确定错误会出现在这些代码段之一中,如果有任何帮助,我将不胜感激。

编辑:好的,在第一张海报的帮助下,我解决了最初的问题,但现在打印时出现了无限循环。我很确定这将是因为我按顺序插入并且从未在最后一项之后设置 NULL 指针。这看起来是否正确,如果是,有什么办法可以解决吗?再次感谢

【问题讨论】:

  • Process *&head 不合法 c。你不能通过引用传递。
  • 你是用 c++ 编译器编译这个吗?
  • 其实我是我所熟悉的,我的班级在做什么,因为我们对C一无所知,也没有时间学习它。我们使用 C 的真正原因是我们不会使用 c++ 的面向对象属性。而且我知道当我这样做时似乎不对,但是每次我调用 insert 时都会重置 head,如果有其他方法可以做到这一点,我会很乐意修复它。
  • 在 c 中,您可以将 head 传递为 Process **head。然后您可以使用(*head)->field*head = newhead。这样,c 编译器就会接受它。

标签: c++ linked-list


【解决方案1】:

在您的函数中,您传递了一个Process 按值,这意味着该函数将处理Process 对象的本地副本,该对象将在函数退出时被销毁。

但是,您的代码在此本地副本中进行链接,因此一旦您退出函数,您的链接列表现在正在使用已被销毁的 Process 对象。

另一个问题是,当循环搜索插入点时,您没有考虑插入的进程可能是最后一个的情况,在这种情况下curr 将在循环中变为 NULL。

【讨论】:

  • 感谢您解决了一个问题,一个我应该看到的问题。我现在正在打印一个无限循环,只打印我插入的最后一个项目,但也许我可以找到它的问题。
【解决方案2】:

您应该学习如何使用调试器。在 Linux 上,您应该使用-g(获取编译器生成的调试信息)和-Wall(获取所有警告)进行编译,并传递给gccg++。然后你可以在你的可执行文件上使用gdb 调试器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 2020-02-10
    • 1970-01-01
    • 2012-04-02
    • 2013-03-08
    相关资源
    最近更新 更多