vc++ 6.0 应用程序异常 指令引用的内存不能读

vc++ 6.0应用程序错误 指令引用的内存不能读一、实验名称:进程管理二、实验目的在采用多道程序设计的系统中,

vc++ 6.0 应用程序错误 指令引用的内存不能读
一、实验名称:进程管理
二、实验目的
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。
三、实验内容
设计一个按优先数调度算法实现处理器调度的程序。
[提示]:
(1) 假定系统有五个进程,每一个进程用一个进程控制块PCB来代表,进程控制块的格式为:
进程名
指针
要求运行时间
优先数
状态
其中,进程名——作为进程的标识,假设五个进程的进程名分别为P1,P2,P3,P4,P5。
指针——按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0”。
要求运行时间——假设进程需要运行的单位时间数。
优先数——赋予进程的优先数,调度时总是选取优先数大的进程先执行。
状态——可假设有两种状态,“就绪”状态和“结束”状态。五个进程的初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态为“结束”,用“E”表示。
(2) 在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间”。
(3) 为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。例:
  队首标志
  K2  
K1P1 K2P2 K3P3 K4P4 K5P5
0K4K5K3K1
23124
15342
RRRRR
PCB1PCB2PCB3PCB4PCB5

(4) 处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1”。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:
优先数-1
要求运行时间-1
来模拟进程的一次运行。
提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。
(5) 进程运行一次后,若要求运行时间?0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间=0,则把它的状态修改成“结束”(E),且退出队列。
(6) 若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。
(7) 在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。
(8) 为五个进程任意确定一组“优先数”和“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。
#include <iostream>
#include <string>
using namespace std;
typedef struct pcb
{
//string pname;
char pname[20];
int time ;
int prior;
char s;
struct pcb * next;
}PCB,*sqPCB;
void init(sqPCB & p)
{
p=(sqPCB)malloc(sizeof(PCB));
if(!p)
cout<<"未能申请到内存"<<endl;
p->next=NULL;


}
void creat(sqPCB & p,int n)
{
init(p);
int i=0;


sqPCB p1;

for(i=0;i<n;i++)
{

p1=(sqPCB)malloc(sizeof(PCB));
if(!p1)
cout<<"未能申请到内存"<<endl;
//p1=new PCB;
cout<<"请输入第"<<i+1<<"个进程的进程名,要求运行时间,优先级"<<endl;
cin>>p1->pname>>p1->time>>p1->prior;

p1->s ='R';
p1->next = p->next ;
p->next = p1;
//delete p1;
//free(p1);



}

}

void sort(sqPCB & p)
{
sqPCB p1,p2,F1,F2;
p1=p->next ;
F1=p;
int temp;
while(p1->next)
{
p2=p1->next;
F2=p1;
temp=p1->prior;
while(p2)
{
if (temp<p2->prior )
{
if(p1==F2)
{


p1->next =p2->next;
p2->next=p1;
F1->next=p2;
p1=F1->next;
p2=F2->next;
F2=p2;
p2=F2->next;
}
else
{
F2->next=p2->next;
p2->next=p1->next;
p1->next=F2->next;
F2->next=p1;
F1->next=p2;
p1=F1->next;
p2=F2->next;
F2=p2;
p2=F2->next;
}


}
else
{
F2=p2;
p2=F2->next;

}






}
F1=p1;
p1=F1->next;


}


}

void Run(sqPCB & p)
{

sqPCB p1,p2;
int i=0;
p1=p->next;
while(p1)
{
i++;
cout<<"第"<<i<<"次调用"<<endl;
cout<<"进程名是:"<<p1->pname<<endl;
cout<<"运行前:"<<endl;
cout<<"运行时间是:"<<p1->time<<endl;
cout<<"优先级是:"<<p1->prior<<endl;
p1->time--;
p1->prior--;
cout<<"运行后:"<<endl;
cout<<"运行时间是:"<<p1->time<<endl;


cout<<"优先级是:"<<p1->prior<<endl;
if(p1->time==0)
{p2=p1;
p2->s='E';
p->next =p2->next ;
p2=p->next ;
free(p2);


}

if(p1->prior==0)
{
cout<<"优先级已经为0,而要求运行时间依旧大于0,将该进程强制结束"<<endl;
p2=p1;
p2->s='E';
p->next =p2->next ;
p2=p->next ;
free(p2);
}


sort(p);
p1=p->next ;




}




}
int main()
{
sqPCB p;
//init(p);
int s;
cout<<"请输入要创建的进程个数:"<<endl;
cin>>s;
creat(p,s);
sort(p);
Run(p);
return 0;



}
运行的时候老是提示内存不可读,怎么回事







[解决办法]
sort里面有问题。单步调试发现:F2=p2;p2=F2->next;你有没有想过当F2为null的时候呢???F2->next?????
[解决办法]
借用老赵的一句话:
单步调试是程序员必须掌握的能力