千家信息网

如何理解C语言函数传参:指针的指针

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍"如何理解C语言函数传参:指针的指针",在日常操作中,相信很多人在如何理解C语言函数传参:指针的指针问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何理
千家信息网最后更新 2025年11月07日如何理解C语言函数传参:指针的指针

这篇文章主要介绍"如何理解C语言函数传参:指针的指针",在日常操作中,相信很多人在如何理解C语言函数传参:指针的指针问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何理解C语言函数传参:指针的指针"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

代码:版本1

void do_malloc(char *p, int size) {     p = (char *)malloc(size + 1);     memset(p, 0, size + 1); }   int main(int argc, char *argv[]) {     char *pData = 0;     do_malloc(pData, 128);     sprintf(pData, "%s", "abc");     printf(pData);     return 0; }

代码本意是:do_work()函数向系统堆空间申请size个字节的空间,然后返回给main函数中的pData指针。但是,执行的时候报错:Segmentation fault (core dumped)。

分析原因

我们可以把char*类型的指针看成一个遥控器,如果给这个指针赋值,就相当于把这个遥控器与一个设备进行绑定,可以通过遥控器来控制这个设备。

执行char *pData = 0;

pData内容为空,相当于这个遥控器没有与任何设备绑定,如下图:

执行do_work(pData, 128);

这里传递的参数是pData本身,所以进入void do_work(char *p, int size)函数之后,实参pData的内容就赋值给形参p,所以指针p的内容也为空,也就是说:p这个遥控器也没有与任何设备绑定,如下图:

执行p = (char *)malloc(size + 1);

这句话的作用是把申请到的堆空间的首地址,赋值给p。就是说:现在p指向了内存中的一块空间,就相当于一个p这个遥控器与一个设备进行绑定了,可以控制这个设备了,如下图:

到这里就已经看到程序崩溃的原因了:虽然给指针p赋值了,但是实参pData中的内容一直为空,因此从do_malloc函数返回之后,pData仍然是一个空指针,所以就崩溃了。当然,p指向的堆空间也就泄露了。

代码:版本2

代码的本意是在do_malloc函数中申请堆空间,然后把这块空间的首地址赋值给pData。在do_malloc函数中,调用系统函数malloc成功之后返回所分配空间的首地址,关键是要把这个首地址送给pData指针,也就是说要让pData指针变量中的值等于这个堆空间的首地址。

那应该如何通过中间的一个函数来完成这个功能呢,如下代码:

void do_malloc(char **p, int size) {     *p = (char *)malloc(size + 1);     memset(*p, 0, size + 1); }   int main(int argc, char *argv[]) {     char *pData = 0;     do_malloc(&pData, 128);     sprintf(pData, "%s", "abc");     printf(pData);     return 0; }

执行char *pData = 0;

这一句没有变化。

执行do_malloc(&pData, 128);

把pData指针的地址作为实参进行传递,因为pData本身就是一个指针,加上取地址符&,就是指针的指针(二级指针),因此do_malloc函数的第一个参数就要定义成char**类型,此时示意如图:

p此时是一个二级指针,参数赋值之后,p里面的内容就变成了pData这个指针变量的地址,也就是说p指向了pData这个变量。

执行*p = (char *)malloc(size + 1);

这句话首先搞明白*p是啥意思,刚才说了,p是一个指针,它指向了pData这个变量。那么在p前面加上取值操作符*,就相当于是取出指针p中的值,它里面的值就是pData!因此,malloc函数返回的堆空间首地址,就相当于是赋值给了pData,如下图:

此时,pData这个遥控器就与分配的这块堆空间绑定在一起,随后再操作pData就没有问题了。

到此,关于"如何理解C语言函数传参:指针的指针"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

指针 函数 空间 地址 遥控器 遥控 设备 代码 内容 语言 变量 就是 指向 学习 也就是 也就是说 参数 原因 更多 本意 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全空间软件 北京哪家软件开发培训机构好 工业网络技术阶段作业 做软件开发销售好做吗 分布式数据库的下一代 泰尔瑞亚服务器注册账号 php网站数据库在哪里 数据库如何更改网址 网络安全按协会的宣传工作 松江区系统软件开发流程 军校网络安全专业毕业分配 桥西区优创软件开发工作室 一种便于清洁的服务器机柜 信息技术网络安全教育ppt 上海钛有互联网信息科技公司 派出所网络安全法制宣传 国服正式服服务器 微信记录服务器一般保留几年 计算机软件开发和芯片设计 数据库详细设计文档 连接数据库出现解析错误 昆河Ms5音乐服务器功能 网络安全到底有什么重要性 计算机网络技术是什么的含义 建立大数据库整改措施 服务器和存储的区别 公司服务器安全相关策略 佟年 大学生网络安全比赛 网络安全维护工程师是程序员吗 龙岩租房网络安全
0