一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情。
程序崩溃
1.运行代码程序会出现崩溃的现象
2.程序存在内存泄漏的问题
str以值传递的形式给p,p是GetMemory函数的形参,只在函数内部有效,等GetMemory函数返回以后,动态开辟内存尚未释放,并且无法找到,所以会造成内存泄漏
改正:
改法1:
利用二级指针
void GetMemory(char**p)
{
*p = (char*)malloc(100);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
prinf(str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}
改法2:
利用返回值的方式
char* GetMemory(char* p)
{
p = (char*)malloc(100);
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory(&str);
strcpy(str, "hello world");
prinf(str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}
2.下列代码会出现什么问题
char* GetMemory(void)
{
char* p[] = "hello world";
return p;
}
void Test(void)
{
char* str = NULL;
str = GetMemory();
printf(str);
}
int main()
{
Test();
return 0;
}
返回栈空间的地址的问题(非法访问内存的问题)
p创建的空间在离开函数GetMemory的时候已经将这块空间还给操作系统
相似的例子:
int* test()
{
int a = 10;//栈区
return &a;
}
int main()
{
int *p = test();
*p = 20;
return 0;
}
同为返回栈空间的地址的问题
改正:
加长a的生命周期,把a放在静态区——static
int* test()
{
static int a = 10;//栈区
return &a;
}
int main()
{
test();
return 0;
}
举例:
int* test()
{
int* ptr = malloc(100);//堆区
return ptr;
}
int main()
{
int* p = test();
return 0;
}
堆空间的空间只有free可以回收
3.请问运行Test函数会有什么样的结果?
int* test()
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
if(str!=NULL)
{
strcpy(str, "world");
printf(str);
}
}
Answer:会篡改动态内存区的内容。 因为free(str)之后,str成为野指针,if(str!=NULL)语句不起作用
改正:
int* test()
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
str = NULL;
if(str!=NULL)
{
strcpy(str, "world");
printf(str);
}
}