C语言指针函数和动态内存管理

int main(){
	void fuzhi(int *,int);
	int *t,k;
	//t=(int *)malloc(3*sizeof(int));
	scanf("%d",&k);
	fuzhi(t,k);
	printf("%d\t%d\t%d\n",*t,*(t+1),*(t+2));
	return 0;
}

void fuzhi(int *t,int k){
	t=(int *)malloc(3*sizeof(int));
	*t=k;
	*(t+1)=k+1;
	*(t+2)=k+2;
}

这段代码的编译不会报错,0错误0警告,但是执行的时候就是有问题。原因在于对于指针函数的理解没有到位,指针函数会指针变量作为函数,我们知道通过指针函数就可以直接对元素据进行操控没有了形参和实参的传值。但是真的是这样吗?其实不是,还是会有形参和实参的传值发生的。指针变量的形参和实参法发生了传值。我们把指针作为函数变量的时候,其实是这样的:函数体在知道它的形参里有一个是指针变量,它不管指着指针指向哪,它都会按照我们安排好的模式对这个指针指向的地址里面的内容进行操控。那么它怎么知道这个这正指向哪里呢?就是在函数被调用的时候我们告诉它的。所以还是发生了了一个指针值传递的过程。我们可以通过指针取消我们想要操控的内容在函数调用是值传递过程,代价是发生一次指针变量的值传递。所以但我们想要操控的对象是指针自身的时候,上面的代码就有问题了。我们上面代码中,main函数中的t指针,没有初始化,函数体里面的t指针是一个auto的局部变量,在函数调用的过程中,这个局部指针变量t被复制了,但是main函数里面的t没变啊,发生的其实是这样的事情:t2=t1;t2=(。。。)malloc(。。。);t1表示main中的t,t2表示函数体里面的t,我们可以看到在函数被调用的时候就有问题了,t1的值被赋予t2,而t1本身自己都没有被初始化。但是t2在后面的malloc中又被赋予了一个合法值。不过这都无关紧要,因为函数调用结束的时候,t2就消失了。从头到尾,t1就没有被赋值过。而后面的打印语句实际上就是在试图使用一个没有初始化的指针,程序会发生运行时错误。所以我们可以把代码改成这样:

int main(){
	void fuzhi(int *,int);
	int *t,k;
	t=(int *)malloc(3*sizeof(int));
	scanf("%d",&k);
	fuzhi(t,k);
	printf("%d\t%d\t%d\n",*t,*(t+1),*(t+2));
	return 0;
}

void fuzhi(int *t,int k){
	//t=(int *)malloc(3*sizeof(int));
	*t=k;
	*(t+1)=k+1;
	*(t+2)=k+2;
}

这时候是这样的,在main中指针t1被初始化了,指向一个六个字节的空间的首地址。加入是123456把,在函数被调用的时候,这个被调用的函数占据一个别的空间,在这个空间里面有一个指针变量t2,main函数和这个被调用函数发生一个指针变量的值传递,t2=t1,t2也等于123456了。然后t=k,就是让空间123456~123457存被穿过来的k的值,t就等价于12345和123459这两个字节的空间,存放k+1这个值。剩下的就是一样的过程了。然后函数结束,t2这个变量消失,这个函数所占用的空间也被释放。main函数里面的指针t的值也没变,还是哪个6个字节的空间的首地址。不多对这块空间上的操作实实在在发生了,用t,(t+1),*(t+2)打印出来的就是我们输入的值K,K+1,K+2了。
我觉得使用指向指针的指针应该也是可以解决这个问题的。具体的还没想好,又思路的评论区见。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KOKO银角大王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值