概述
例一:无法获得开辟好的内存
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语言内存开辟常见错误所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复