C语言----四道题充分体会动态内存错误
Posted 4nc414g0n
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言----四道题充分体会动态内存错误相关的知识,希望对你有一定的参考价值。
第一题
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
分析:
- p地址并未返回,str仍为空
strcpy目标地址为空->出错
- 并且p未被释放->
内存泄漏
第二题
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
打印:烫烫烫…乱码
分析:(此类问题为返回栈空间地址问题
)
- p在栈空间开辟出了GetMemory就被销毁了
- 虽然p被返回但p开辟的空间已被销毁
- 付给str的是被销毁空间的地址,
实际上是非法访问
第三题
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
第四题
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, "hello");
free(str);
if(str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
分析:
free后未置空
- 使用strcpy函数是还去访问已经被释放的空间
以上是关于C语言----四道题充分体会动态内存错误的主要内容,如果未能解决你的问题,请参考以下文章
C语言之动态内存管理(动态内存分配+经典笔试题+柔性数组)[建议收藏]