指针作为函数的参数
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 这小节的内容解释了你秀出的代码失败的原因和成功的原因。基础内容翻书多多益善
回答:
C 语言中,指针作为函数的参数时,依然是产生一个复本的,是这个指针自身的复本,而不是指针所指向的『数据』的复本。
回答:
c语言只有值传递
c语言只有值传递
c语言只有值传递
很重要所以说三遍
如果看不懂请去百度值传递和引用传递
回答:
指针可以看做是一个整数,4个字节的存储空间
你失败的那个例子,就跟 @garfileo 说的一样, 依旧只是备份一个4个字节的空间出来,并且指向新申请的内存。
函数运行完后, 这4个直接的空间一样被释放掉了。 新申请的内存,依然存在,并没有被释放。
所以传址
能成功,传值
失败
以上是 指针作为函数的参数 的全部内容, 来源链接: utcz.com/p/195235.html