本节重点内容:
使用 malloc、calloc、realloc 函数申请的空间,如果不想使用,需要 free 释放,如果不使用 free 释放,在程序结束后,也会由操作系统进行回收。
如果没有使用 free 释放,程序也不结束,所申请的空间既没有使用,也没有释放,也没有回收,我们将这种情况称为内存泄漏。
解决方法是:自己申请的,自己释放。自己不方便释放的,告诉别人进行释放。
题目1:请问运行Test 函数有哪些的错误?
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
void GetMemory(char* p)
{
p = (char*)malloc(100);
}
int main()
{
char* str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
return 0;
}
错误处:
解决方案一:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
char* GetMemory( )
{
char* p = (char*)malloc(100);
return p;
}
int main()
{
char* str = NULL;
str = GetMemory( );
strcpy(str, "hello world");
printf(str);
free(str);
str = NULL;
return 0;
}
解决方案二:
void GetMemory(char** p)
{
*p = (char*)malloc(100);
}
int main()
{
char* str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf(str);
free(str);
str = NULL;
return 0;
}
代码运行结果如下:
题目2:请问运行Test 函数有哪些的错误?
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
char* GetMemory(void)
{
char p[] = "hello world";
return p;
}
int main()
{
char* str = NULL;
str = GetMemory();
printf(str);
}
错误处:返回栈空间地址的问题
解决方案:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
char* GetMemory()
{
static char p[] = "hello world";
return p;
}
int main()
{
char* str = NULL;
str = GetMemory();
printf(str);
}
代码运行结果如下:
题目3:请问运行Test 函数有哪些的错误?
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
void GetMemory(char** p, int num)
{
*p = (char*)malloc(num);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
int main()
{
Test();
return 0;
}
错误处:内存泄漏
解决方案:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
void GetMemory(char** p, int num)
{
*p = (char*)malloc(num);
}
void Test(void)
{
char* str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
free(str);
str = NULL;
}
int main()
{
Test();
return 0;
}
题目4:请问运行Test 函数有哪些的错误?
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
void Test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main()
{
Test();
return 0;
}
错误处:栈空间的非法访问
解决方案:
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
void Test(void)
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
str = NULL;
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
int main()
{
Test();
return 0;
}
感谢大家能够看完这篇博客,创作时长,小伙伴们觉得我的博客对你有帮助,不妨留下你的点赞的收藏,关注我,带你了解不一样的C语言。