指针作为函数的参数

jql09
  • 636
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,而这样却可以成功,
请大神详细解释

回复
阅读 3.5k
4 个回答
li21
  • 3.1k
✓ 已被采纳

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

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

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

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

图片描述

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

图片描述

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

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

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

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

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

宣传栏