下面代码有什么问题?
void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf( str );
}
解释:
1、GetMemory函数的参数应该用二级指针;
2、main函数中的指针p作为形参传递,会产生指针的拷贝p_cpy传入GetMemory函数中;即传入GetMemory的指针如果是一级指针的话,所分配的内存的地址是给拷贝的指针p_cpy,而不是给p;
3、如果使用二级指针传递,pp作为形参,会产生指针的拷贝pp_cpy,此时pp和pp_cpy都是指向p,所分配的内存的地址自然也就可以传递给*pp(即p)啦!
以上三点仅是说明str并没有分配到内存,是NULL;编译出错。
修改后:
void GetMemory( char **p )
{
*p = (char *) malloc( 100 );
assert(*p!=NULL); //判断是否申请上
}
void Test(void)
{ ......
GetMemory( &str ); //str已经是个指针,&str就是二级指针;
......
if(str)
{
free(str); //有malloc就有free;
str=NULL; //避免成为野指针
}
}
修改后:
形参改为**p、分配的地址传给*p、传过去的参数为&str、判断是否申请内存成功以及free释放置空指针