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,而这样却可以成功,
请大神详细解释
update 如果你觉得语言描述起来抽象,那么看图应该好理解了吧
函数的参数本质就是值传递,所以我们关键看传递的是什么值。
char *pReturn
作为参数时,传递的pReturn仅仅是pMReturn的一个副本,因此pReturn =
修改的是一个副本指针所指向的值
,函数返回后就丢失了;char **pReturn
作为参数时,传递的pReturn指向的恰恰是pMReturn,因此*pReturn =
修改的是pReturn所指向的值的值,即,修改的是pMrreturn的值
。《C程序设计语言 第2版》(K&R C) P81 这小节的内容解释了你秀出的代码失败的原因和成功的原因。基础内容翻书多多益善