【C语言进阶】动态内存经典笔试题

在这里插入图片描述
本文作者:小小白的崛起之路
更新日期: 2021.7.21
本文声明: 由于小小白水平有限,内容难免有错误和不准确之处,望读者批评指正!
动态内存管理相关知识链接:小小白关于动态内存知识的总结

题目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 函数会有什么样的结果?
在这里插入图片描述

运行结果
在这里插入图片描述
很显然,程序挂掉了。

原因分析:
在这里插入图片描述
代码完善:

改法 1:

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

改法 2:

void GetMemory(char** p)
{
    
    
	*p = (char*)malloc(100);
}
void Test(void)
{
    
    
	char* str = NULL;
	GetMemory(&str);//传地址

	strcpy(str, "hello world");
	printf(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;
}

问题:运行Test 函数会有什么样的结果?

运行结果
在这里插入图片描述
在这里插入图片描述
原因分析:
在这里插入图片描述
通俗来说:
在这里插入图片描述

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

问题:运行Test 函数会有什么样的结果?
在这里插入图片描述
会心一笑,这个好像没毛病!运行结果也没问题。
运行结果
在这里插入图片描述
看似结果好像没什么毛病,但是犯了动态内存中很致命的错误,还缺两步:
在这里插入图片描述
所以平时一定要注意细节!!

题目4:

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

问题:运行Test 函数会有什么样的结果?

运行结果
在这里插入图片描述
好像也没什么问题,但如果你看了我关于动态内存知识的分享以及对上面几个题有感受的话,那你一定认为有问题。
恭喜你,你进步了!
在这里插入图片描述
原因分析:

虽然malloc的空间被free了,但此时为非空,进入判断语句,此时属于非法访问空间。故应在free(str); 后面加上 str = NULL;


今天分享就到这里。

猜你喜欢

转载自blog.csdn.net/weixin_53306029/article/details/118963819