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);
}

分析:

  1. p地址并未返回,str仍为空 strcpy目标地址为空->出错
  2. 并且p未被释放->内存泄漏

第二题

char *GetMemory(void)
{
	char p[] = "hello world";
	return p;
}
void Test(void)
{
	char *str = NULL;
	str = GetMemory();
	printf(str);
}

打印:烫烫烫…乱码
分析:(此类问题为返回栈空间地址问题

  1. p在栈空间开辟出了GetMemory就被销毁了
  2. 虽然p被返回但p开辟的空间已被销毁
  3. 付给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);
}

分析:

  1. 内存泄露 没有free

第四题

void Test(void)
{
	char *str = (char *) malloc(100);
	strcpy(str, "hello");
	free(str);
	if(str != NULL)
	{
		strcpy(str, "world");
		printf(str);
	}
} 

分析:

  1. free后未置空
  2. 使用strcpy函数是还去访问已经被释放的空间

以上是关于C语言----四道题充分体会动态内存错误的主要内容,如果未能解决你的问题,请参考以下文章

C语言之动态内存管理(动态内存分配+经典笔试题+柔性数组)[建议收藏]

C语言动态内存分配

梦开始的地方—— C语言动态内存管理(malloc+calloc+realloc+free)

浅谈C语言的动态内存开辟

C语言进阶:动态内存管理

玩转C语言动态内存,轻松管理动态内存空间