2011-10-29 75 views
3

首先,我是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; 
} 
} 

这里是我的简单的循环,这应该打印的清单,这将给人一种一个“访问VIO运行之前几次测试lation阅读位置'

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

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

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

+1

'Process *&head'不合法c。你不能通过引用传递。 – Dave

+0

你是用C++编译器编译的吗? – Dave

+0

其实我是,我所熟悉的,以及我们的班级正在做什么,因为我们没有C的知识,也没有时间学习它。我们使用C的真正原因是我们不会使用C++的面向对象的属性。而且我知道,当我做这件事时看起来并不正确,但是每次我插入插件时都会重置头部,如果还有其他方法可以做到这一点,我会很乐意修复它。 – user1019430

回答

2

在你的函数要传递一个Process按值,这意味着该功能将在将要函数退出时销毁Process对象的本地副本。

但是,您的代码正在链接到本地​​副本中,因此一旦您退出该功能,您的链接列表正在使用已经销毁的Process对象。

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

+0

谢谢你解决了一个问题,我应该看到一个问题。我现在正在打印我插入的最后一个项目的无限循环,但也许我可以找到它的问题。 – user1019430

0

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