热爱软件过程

对c/c++的热爱犹如对美女的热爱

 

如何传出函数中malloc分配的指针(转贴csdn)

请看先看下面,猜猜会有什么样的结果!
void  B(char*);  
void  D(char*);  
void  A()  
{  
               char  *  p  =  new  char[20];//(char*)malloc(20);  
               B(p);  
               cout  <<"in  A,  address="  <<(long)  p  <<  endl;  
               cout  <<"in  A,  content="  <<  p  <<  endl;  
               delete(p);  
}  
void  B(char  *  p)  
{  
               memcpy(p,"aaa",3);  
               cout  <<  "in  B,  address="  <<  (long)p  <<  endl;  
               cout  <<  "in  B,  content="  <<  p  <<  endl;  
}  
void  C()  
{  
               char  *  p  =  0;  
               D(p);  
               cout  <<"in  C  after  call  D,  address="  <<(long)  p  <<  endl;  
               cout  <<"in  C  after  call  D,  content="  <<  p  <<  endl;  
               free(p);  
}  
void  D(char*  p)  
{  
               p  =  (char*)  malloc(20);  
               memcpy(p,"aaa",3);  
               cout  <<  "in  D,  address="  <<  (long)p  <<  endl;  
               cout  <<  "in  D,  content="  <<  p  <<  endl;  
}  
 
int  main()  
{  
               A();  
               cout  <<  "-----"  <<  endl;  
               C();  
}  
 
为什么A调B可以获取指针参数所指内容,而C调D无法获取内容?  
 
---------------------------------------------------------------  
 
void  D(char*&  p);  
 
---------------------------------------------------------------  
 
因为D接受的是一个“指针值参”(C不支持变参类型),所以你在D中对p的赋值不会影响C的的变量。  
改为:  
void  D(char**  p)  
{  
               *p  =  (char*)  malloc(20);  
               memcpy(*p,"aaa",3);  
               cout  <<  "in  D,  address="  <<  (long)*p  <<  endl;  
               cout  <<  "in  D,  content="  <<  *p  <<  endl;  
}  
void  C()  
{  
               char  *  p  =  0;  
               D(&p);  
               cout  <<"in  C  after  call  D,  address="  <<(long)  p  <<  endl;  
               cout  <<"in  C  after  call  D,  content="  <<  p  <<  endl;  
               free(p);  
}  
也就是用指针实现“变参”的方法。  
 
---------------------------------------------------------------  
 
因为c是传值而不是传地址的  
void  D(char*  p)  
{  
               p  =  (char*)  malloc(20);  //被重新赋值但无法返回。  
               memcpy(p,"aaa",3);  
               cout  <<  "in  D,  address="  <<  (long)p  <<  endl;  
               cout  <<  "in  D,  content="  <<  p  <<  endl;  
}  
 
改为:  
char  *  D()  
{  
     p=...  
     return  p;  
}  
 
void  C()  
{  
               char  *  p  =  0;  
               p=  D();  
               ...  
}  
 
---------------------------------------------------------------  
 
因为c是传值而不是传地址的  
void  D(char*  p)  
{  
               p  =  (char*)  malloc(20);  //被重新赋值但无法返回。  
               memcpy(p,"aaa",3);  
               cout  <<  "in  D,  address="  <<  (long)p  <<  endl;  
               cout  <<  "in  D,  content="  <<  p  <<  endl;  
}  
 
改为:  
char  *  D()  
{  
     p=...  
     return  p;  
}  
 
void  C()  
{  
               char  *  p  =  0;  
               p=  D();  
               ...  
}  
 
---------------------------------------------------------------  
 
或者如snipersu所说使用引用类型(只能在C++中使用)  
---------------------------------------------------------------  
 
用char*传递参数,实际上是传递了指针的副本。如果修改指针所指的内容,则函数调用结束后内容自然保存了变化。如果是修改了指针,则实际上是修改了指针副本本身,此时再修改其所指值,则显然不是修改的原来地址处的内容,所以函数结束后也没有看到内容变化。D中使用malloc改变了指针副本所指向的单元。  
如果要想在被调函数中分配空间,赋值后希望调用方能获取内容,应该使用char**类型做参数。  
---------------------------------------------------------------  
 
因为在函数中传指针(如:p)的话,实际上是函数建立一个指针指向p所指的地方,由于才C中p是个空指针,所以虽然在D中让D的p指向了分配的空间但在C中的p还是指向空的。  
 

posted on 2005-11-09 11:14 逗泥丸 阅读(825) 评论(0)  编辑 收藏 引用 所属分类: 技术感悟

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论