C/C++ 值传递和地址传递在指针作为参数时的体现

本文通过一个实例探讨了在C/C++中使用指针作为参数时,值传递和地址传递的区别。在尝试用构造函数分配堆内存时,由于错误地使用了值传递,导致指针在函数内部分配的内存无法在外部访问。通过分析错误代码,揭示了地址传递的原理,指出应使用指针的地址而不是其值来传递,以确保对原始指针的修改。作者总结了在使用指针时可能出现的问题,强调了指针的安全性和检查的重要性,并提到了C++中的智能指针作为提高安全性的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题的背景:

之前在写c语言实验课作业的时候,老师布置的是用struct类型来创建一个Student变量,包括姓名、学号、性别和成绩,并初始化一个Student类的数组然后随机化学生的初始成绩,来完成对学生成绩的排序和信息的输出。

我想作为既然把学生作为一个struct类型来看待,并且还要实现学生成绩的排序与信息展示,那么完全可以把Struct类型升级成C++里的那种Class类型,让Student作为一个类拥有自己的数据成员和成员函数,即一个学生可以拥有姓名、学号、性别和成绩这四种数据;同时可以有显示所有信息和对成绩排序的方法。于是我想到了用函数指针来实现struct类型中的成员函数。

问题的发生:

在造构造函数和析构函数的轮子时,出现了严重的问题。为了近似地实现构造函数的功能(其实没什么必要2333,因为这点数据量等程序结束后交给操作系统一次性回收完全没啥问题,纯粹为了实现一下本人的好奇心),我选择把Student的数据成员全部设置成对应的指针变量,然后用构造函数给这些指针变量申请堆内存,最后在析构函数内释放这些堆内存。但是写下来之后运行的时候vs报了指针为空的异常。

最后排查下来以后,才发现是构造函数出了问题,在构造函数内申请的堆内存并没有成功地返回到主函数中,进而这些数据成员指针在初始化为空指针后就算执行了构造函数,指针也仍然为空。进一步排查后发现,是指针传递过程中犯了一些基础性的错误,导致本来应该使用地址传递的地方使用了值传递,因此构造函数内申请堆内存后主函数的指针并未因此指向之前开辟的堆内存。

对当时情形的代码简化及对比:

//此处代码里,若把堆内存申请方式从malloc/free换成c++中的new/delete,结果也是一样的
#include <cstdio>
#include <cstdlib>
void ApplyHeapMemory1(int* _p1)	//传指针,无返回值
{
   
	_p1 = (int*)malloc(3 * sizeof(int));

	for (int i = 0; i < 3; i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值