动态内存经典笔试题分析

1.代码1

void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
int main()
{
Test();
return 0;
}

我们先来分析一下这串代码,我们创建了两个函数,在Test中调用了GetMemory函数,了解到我们的目的是想将hello word 拷贝到calloc开辟的空间里面,然后在终端打印出来,我们一看代码好像没什么问题,那我们来运行一下,看看能不能达到我们想要的效果。

运行结果:

动态内存经典笔试题分析_第1张图片

没有任何结果,这是为什么呢?因为在GetMemory中申请的空间是局部变量,出函数就会被销毁。所以我们拷贝不过来,运行结果也为空。

2.代码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;
}

那这串代码的运行结果又是什么呢?我们来看看:

动态内存经典笔试题分析_第2张图片

为什么是一串乱码呢?在这里问题也是出在GetMemry上,创建的数组p在出函数后就被销毁了,str接收了GetMemory的返回值,但这个指针是没有指向任何空间的,所以在打印时就是一些乱码。在这里我们可以将p数组改为静态的(让其出函数不会被销毁),即可。演示如下:

动态内存经典笔试题分析_第3张图片

我们使用static将其变为静态数组,只有在程序结束后才会被销毁。

3.代码3 

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

这个代码运用了二级指针的知识,那么大家思考一下这个能完成我们的目的吗?

结果为:

动态内存经典笔试题分析_第4张图片

这是为什么呢?大家可以先思考思考,下一期会解释。嘿嘿

4. 代码4

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

代码的运行结果为:

动态内存经典笔试题分析_第5张图片

有人就会想我们已经将str所指向的空间给释放了,怎么还是可以打印出来。在释放了为str指针分配的内存后,仍然在if语句中访问它。这是未定义的行为。能打印出来不代表是对的,也许只是碰巧我们申请的空间没有被覆盖。

动态内存经典笔试题分析_第6张图片 谢谢

你可能感兴趣的:(开发语言,c语言)