打印时无限循环

时间:2011-10-29 05:36:39

标签: c++ linked-list

首先,我是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指针。这看起来是否正确,如果是的话,有什么方法可以解决它吗?再次感谢

2 个答案:

答案 0 :(得分:2)

在您的函数中,您按值传递Process ,这意味着该函数将在Process对象的本地副本上运行,该副本将在功能退出。

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

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

答案 1 :(得分:0)

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