指针作为参数传递时的陷阱:内部操作了指针指向的地址(指针的栈内容),而没有操作指针指向的内存(指针的堆内容),从而导致程序运行不如意。
此处以:传入指针在函数内申请空间的经典错误为例
指针经典错误操作:在传入函数中申请内存
void GetMemory(char *p, int num)
{
p = (cahr *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
GetMemory(str, 100);//str在这里仍然为NULL
strcpy(str, “hello”);//运行错误,str中没有内存空间用来复制
}
错误原因:
函数传参时,编译器为函数的每个参数准备了副本,在这里面str的副本就是p,传参之后,str指向Null,p指向str,函数体中给p申请了内存,就将p从指向str改为指向一片新申请的内存空间,str没有变化,仍然指向Null,函数体返回后,程序并没有指针接收临时指针变量申请的内存,导致申请的内存失去访问能力,造成内存泄露。
解决方法:
一:使用指向指针的指针,取引用获得外部指针并申请内存。
void GetMemory(char **p, int num)
{
*p = (cahr *)malloc(sizeof(char) * num);//使用指向指针的指针,
//对其解引用,(*p)等价与str
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);//传入str的地址
strcpy(str, “hello”);
}
二、将申请好内存的指针作为返回值返回出去由外部接收
char *GetMemory(char *p, int num)
{
p = (cahr *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str = NULL;
str = GetMemory(str, 100);
strcpy(str, “hello”);
}