1:
void GetMemory(char **p, int num)
{
*p = (char *)malloc(num); //堆
}
void Test1()
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "xmgcc");
printf("%s\n", str);
}
输出内容:xmgcc
void Test11()
{
char *str = NULL;
GetMemory(str, 100);
strcpy(str, "xmgcc");
printf("%s\n", str);
}
//报错的原因:GetMemory的形参是二级指针,应该把一级指针的地址作为实参传递过去
2:
char* GetMemory2()
{
char p[] = "xmgcc"; //栈,函数返回之后,p对应的栈被系统回收
return p;
}
void Test2()
{
char *str = NULL;
str = GetMemory2();
printf("%s\n", str);
}
函数返回地址都是不安全的,因为函数结束后,函数变量的内存都会变释放,因此这个地址其他运用程序也可以用到,会被修改。
解决方法是char p[]="xmgcc"改为 static char p []="xmgcc"设为静态
3:
char *GetMemory3()
{
char *p = malloc(100);
return p;
}
void Test3()
{
char *str = NULL;
str = GetMemory3();
strcpy(str, "xmgcc");
printf("%s\n", str);
}
//正确,函数申请的内存在堆上,通过变量保存函数返回所申请的内存的地址
4:
char* GetMemory4()
{
char p[100]; //栈
return p; //函数申请的内存在栈上面,函数返回后,p对应的栈内存被系统回收
}
void Test4()
{
char *str = NULL;
str = GetMemory4();
strcpy(str, "xmgcc");
printf("%s\n", str);
}
//解决方法:char p[100]改为static char p[100]
5:
void Test5()
{
char *str = (char *)malloc(100);
strcpy(str, "xmgcc");
free(str); //free之后,str指向的内存被释放,str依然指向申请的内存,也就是str的值不是NULL
if (str != NULL) {
strcpy(str, "welcome");
}
printf("%s\n", str);
}
分析错误原因:内存被释放后,不能再对内存进行操作,需要将指针置为NULL,str=NULL
6:
void GetMemory6(char *p)
{
p = (char *)malloc(100); //堆
strcpy(p, "xmgcc");
}
void Test6()
{
char *str = NULL;
GetMemory6(str);
printf("%s\n", str);
free(str);
}
//解决方法:通过函数参数获取分配的内存,只能通过二级指针拿到
总结知识点:堆(malloc)是一直存在的,直到free,对应的指针依然指向该内存
栈:调用函数,由系统分配的,一般用于存放局部变量,函数参数,等等
函数调用结束,栈里的内容就被回收