我是靠谱客的博主 诚心麦片,最近开发中收集的这篇文章主要介绍c语言内存开辟常见错误,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

例一:无法获得开辟好的内存

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

这是一个常见的错误:调用了GetMemoy把str所指向那个null当作形参给这个函数,函数开辟了100字节空间给p,但是这里的p是形参(形参是实参的临时拷贝,str和p指向的是完全不同的空间,出了GetMemoy这个函数,p就会被销毁)没有办法拿到动态开辟的内存的地址,所以出了这个函数p就不存在,但是开辟的内存依然存在,这会导致开辟的内存无法释放,导致内存泄漏。再调用strcpy,把hello word拷贝到str所指向的空字符串中必然会出错!!!

改造一下就ok了

方法一:

void GetMemory(char** p)
{
	*p = (char*)malloc(100);
}
void Test(void)
{
	char* str = NULL;
	GetMemory(&str);//把str的地址传过去,使其改变地址指向的内容
	strcpy(str, "hello world");
	printf(str);
}

把str的地址取出来给GetMemoy函数,使得改变str的指向,这样出了Getmemoy这个函数,str也能指向动态开辟的内存,这样一来就可把字符串拷贝到str了 

方法二:

char* GetMemory()
{
	char *p=(char*)malloc(100);
	if (p==NULL) {
		 perror("");
	}
	else
	{
		return p;
	}
	 
}
void Test(void)
{
	char* str = NULL;
	str=GetMemory();
	strcpy(str, "hello world");
	printf(str);
}

把开辟好的空间返回来赋给str也是可以的!!

例二:对动态内存的越界访问

这里开辟了16字节内存,每一个int*的访问的地址是4个字节,而i等于5时就已经访问了20个字节了,超出了开辟的16字节,所以报错!!!

例三:对非动态内存的free释放 

这里的p不是动态开辟的内存,不可以free释放!! 

最后

以上就是诚心麦片为你收集整理的c语言内存开辟常见错误的全部内容,希望文章能够帮你解决c语言内存开辟常见错误所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部