指针作为函数的参数

发布于 2022-09-01 20:39:13 字数 473 浏览 16 评论 0

void MyFunc(char *pReturn, size_t size)
{
……
pReturn = (char *)malloc(sizeof(char) * num);
……
}
void main(void){
char *pMyReturn=NULL;
MyFunc(pMyReturn,10);
}

首先声明一个指针
char *pMyReturn=NULL;
然后调用MyFunc处理并返回一段长度为size的一段动态内存。为什么会失败?地址作为函数参数是不会产生副本的啊!

void MyFunc (char ** pReturn, size_t size)
{
* pReturn = (char *)malloc(size);
}

MyFunc (&pMyReturn, 100);// 注意参数是 & pMyReturn,而这样却可以成功,
请大神详细解释

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

泅人 2022-09-08 20:39:13

update 如果你觉得语言描述起来抽象,那么看图应该好理解了吧

函数的参数本质就是值传递,所以我们关键看传递的是什么值。

char *pReturn作为参数时,传递的pReturn仅仅是pMReturn的一个副本,因此pReturn =修改的是一个副本指针所指向的值,函数返回后就丢失了;

char **pReturn作为参数时,传递的pReturn指向的恰恰是pMReturn,因此*pReturn =修改的是pReturn所指向的值的值,即,修改的是pMrreturn的值

图片描述

《C程序设计语言 第2版》(K&R C) P81 这小节的内容解释了你秀出的代码失败的原因和成功的原因。基础内容翻书多多益善

图片描述

简美 2022-09-08 20:39:13

C 语言中,指针作为函数的参数时,依然是产生一个复本的,是这个指针自身的复本,而不是指针所指向的『数据』的复本。

会发光的星星闪亮亮i 2022-09-08 20:39:13

c语言只有值传递
c语言只有值传递
c语言只有值传递

很重要所以说三遍
如果看不懂请去百度值传递和引用传递

╰沐子 2022-09-08 20:39:13

指针可以看做是一个整数,4个字节的存储空间
你失败的那个例子,就跟 @garfileo 说的一样, 依旧只是备份一个4个字节的空间出来,并且指向新申请的内存。
函数运行完后, 这4个直接的空间一样被释放掉了。 新申请的内存,依然存在,并没有被释放。

所以传址能成功,传值失败

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文