Debug C
问题背景:在一次操作系统模拟实验中,我构造了一个PCB结构体,它包括几个变量:名称(字符串)、到达时间(整形)。。。
typedef struct pcb {
char pname[N]; //进程名
char state; //状态(就绪R,等待W,完成C)
int apply; //当前申请量
int need; //资源需求总量
int occupy; //已占资源量
int isaccomplish; //能执行完标志
}PCB;
问题简述:我构造了一个初始化函数想要手动输入各个PCB的内容,在我输入PCB的名称时,却总是报错,程序被中断执行。
注意:以下代码在编译时是没有问题的。
void initpcb(PCB *P) {
printf("Please input current PCB's name :");
scanf_s("%s",P->pname,N);
printf("\nPlease input current %s 's apply :",P->pname);
scanf_s("%d",&P->apply);
printf("\nPlesae input current %s 's occupy :", P->pname);
scanf_s("%d", &P->occupy);
printf("\nPlease input current %s 's need :", P->pname);
scanf_s("%d", &P->need);
printf("\n%s create Achieve!", P->pname);
}
int main(){
PCB *P;
initpcb(P);
getchar();
getchar();
return 0;
}
进入运行画面
在我输入了PCB名称 A后,出现了报错。
如图所示,上面显示0xC0000005写入位置0xCCCCCCCC时发生访问冲突。
这种异常提示往往是在你使用了指针的时候遇到的,原因大概有两种:
- 使用了未初始化的指针。
- 使用了已经删除的指针。
确实我的指针一开始并没有初始化,只是直接提出。于是我决定用NULL来初始化我的指针P。
PCB *PA=NULL;
可是万万没想到的是,程序依然报错了!
Expression:buffer != nullptr
VS说缓冲区不能等于空指针。也就是说我们不能用NULL来初始化我们的指针,这是为什么呢?
原来当我们把指针置为NULL时,系统并没有给这个指针分配内存空间,这样我在接下的函数里调用这个指针时,系统并不能对它做任何改变。
也就是说,如果我们想要对一个自己构造的某个结构体类型的指针初始化的话,我们必须让这个指针指向一个该类结构体的一个变量。
终于在我的不断思索下做了如下修改,程序终于正常了。
int main() {
PCB PA;
PCB *Q = &PA;
initpcb(Q);
getchar();
return 0;
}
他可以成功接收一个字符了。
回顾一下指针的含义:
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。
经过上面的调试让我对指针的初始化有了更深的理解,那么换个角度思索一下,我是不是可以在函数调用指针的时候转换一下思路,直接在函数括号中输入这个变量的地址不就可以避免这种问题了吗~于是我做了如下调试:
int main() {
PCB PA;
initpcb(&PA);
getchar();
return 0;
}
终于这个问题成功解决了~!
头发-1…
能力+1…
如果这篇文章对你有所帮助~
欢迎关注我的公众号夏虫不可语冰也
这里有更多你需要的信息哦~