碰到一个指针的问题,记录一下。
都知道,使用指针作为函数形参,可以在函数内修改其指向的内容。
将函数的形参返回,会因为生存期的问题,不能得到正确返回值。
如果返回的是new出来的指针变量(存在堆上,不在栈上),那么函数结束,就不会被该内存就不会被收回。
有以上,我们来看下面的问题
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
在GetMemory中传入指针变量,然后在函数内对其进行动态内存分配,然而并不会出现理想输出。
是因为通过GetMemory不能传递动态内存。Test中的str一直是NULL
但是
回去看第一句话,如果使用指针作为函数形参,可以在函数内修改其指向的内容。
引申过来,我们能不能用指针的指针作为形参,然后给该指针动态分配内存呢?答案是可以的
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
以上代码先定义char* str ,然后使用&str传入str的地址,然后给 str 分配的动态内存。但是好像由于使用了&str,会发生内存泄漏?
所以最好还是使用返回指针的形式,进行动态内存分配。
char *GetMemory()
{
char *p=(char *)malloc(100);
return p;
}
void Test(void){
char *str=NULL;
str=GetMemory();
strcpy(str,"hello world");
printf(str);
}