C基础--函数参数副本

转自:http://blog.csdn.net/chujiangke001/article/details/38553173

 1 void GetMemory(char *p, int num)
 2 {
 3     p = (char*)malloc(sizeof(char)*num);
 4 }
 5 
 6 void main(void)
 7 {
 8     char *str = NULL;
 9     GetMemory(str,100);     //str仍然为NULL   
10     strcpy(str,"hello");    //运行时出错
11     cout<<str<<endl;
12 }

请问运行mian函数的结果如何?其实运行是会报错的,为什么呢?

毛病出在GetMemory中。

编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是_p, 编译器使_p=p(二者指向同一块区域)。如果函数体内的程序修改了_p指向的内容,就导致参数p指向的内容做了相应的修改,这就是指针可以用做输出参数的原因。

但是在上述的代码中,_p申请了新的内存,也就是_p本身的值改变了,即指向了新的内存空间,但是p本身丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。

原文地址:https://www.cnblogs.com/aaronLinux/p/5768602.html