首先,我是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指针。这看起来是否正确,如果是的话,有什么方法可以解决它吗?再次感谢答案 0 :(得分:2)
在您的函数中,您按值传递Process
,这意味着该函数将在Process
对象的本地副本上运行,该副本将在功能退出。
然而,您的代码链接在此本地副本中,因此一旦退出该函数,您的链接列表现在正在使用已被销毁的Process
对象。
另一个问题是,在循环搜索插入点时,您没有考虑插入的进程可能是最后一个的情况,在这种情况下curr
将在循环中变为NULL。
答案 1 :(得分:0)
您应该学习如何使用调试器。在Linux上,您应该使用-g
(以获取编译器生成的调试信息)和-Wall
(以获取所有警告)进行编译,并传递给gcc
或g++
。然后,您可以在可执行文件上使用gdb
调试器。