指针作为函数的参数
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
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个直接的空间一样被释放掉了。 新申请的内存,依然存在,并没有被释放。
所以
传址
能成功,传值
失败