当结构体指针作为函数参数时,该如何修改指针所指向地址的值?

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时发生访问冲突。

这种异常提示往往是在你使用了指针的时候遇到的,原因大概有两种:

  1. 使用了未初始化的指针。
  2. 使用了已经删除的指针。
    确实我的指针一开始并没有初始化,只是直接提出。于是我决定用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…

如果这篇文章对你有所帮助~
欢迎关注我的公众号夏虫不可语冰也
这里有更多你需要的信息哦~
夏虫不可语冰也

猜你喜欢

转载自blog.csdn.net/weixin_43616215/article/details/103155677
今日推荐