栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

动态内存管理经典习题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

动态内存管理经典习题

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

上述代码运行会产生什么结果?

        可以看到程序引发异常,原因就是因为malloc函数是在堆上开辟空间的,函数的变量是在栈上开辟空间的,str变量开始指向NULL,函数传参发生形参实例化,会将str变量拷贝到p变量,p变量指向NULL,经过malloc函数在堆上开辟空间,p指向堆空间的地址,实际上p变量指向的地址str并没有接受到,因此会并没有空间接受字符串“hello world”,发生错误拷贝,这是第一个错误。

        第二个错误是p是临时变量,GetMemory函数运行结束后会释放掉临时变量p,但是堆上的空间并没有使用free函数释放调,会发生内存泄露风险。

        解决方案我给了两个:

        方案一:将临时变量指针返回给str接收。

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

        方案二:使用二级指针,传入函数的是str的地址,对p解引用表示p的内容也就是str,于是开辟的空间地址可以str接收到。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/744008.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号