常见的内存错误及解决方法
一、结构体成员指针未初始化
eg:
#include <stdio.h>
#include <string.h>
struct student
{
char *name;
int score;
}stu,*pstu;
int main()
{
strcpy(stu.name,"pddddd");
stu.score=99;
printf("%s\n",stu.name);
printf("%d\n",stu.score);
return 0;
}
运行结果:
原因分析:
答:定义的结构体变量stu分配了char *类型的指针和int类型整形变量;结构体中的字符指针name没有指向合法的地址。
解决方法:
答:在使用时为字符串指针name动态开辟空间。
#include <stdio.h>
struct student
{
char *name;
int score;
}stu,*pstu;
int main()
{
stu.name=(char *)malloc(8);
strcpy(stu.name,"pddddd");
printf("%s\n",stu.name);
}
二、没有为结构体指针分配足够的内存
#include <stdio.h>
struct student
{
char *name;
int score;
}stu,*pstu;
int main()
{
pstu=(struct student *)malloc(sizeof(struct student));
pstu->name=(char *)malloc(8);
strcpy(pstu->name,"pddddddd");
printf("%s\n",pstu->name);
}
三、函数的入口校验
1.指针在定义时初始化为NULL;
2.在函数入口使用assert(NULL!=p)对参数进行校验。在非参数的地方使用if(NULL!=p)来校验。
四、为指针分配的内存太小
#include <stdio.h>
#include <string.h>
int main()
{
char *p1="abcdefg";
char *p2=(char *)malloc(sizeof(char)*strlen(p1)+1*sizeof(char));
strcpy(p2,p1);
printf("%s\n",p2);
}
注意:
只有字符串常量才有结束标志符。
比如下面这种写法就没有结束标志符了:chara[7]={‘a’,’b’,’c’,’d’,’e’,’f’,’g’};
五、内存分配成功,但并未初始化
对于还不确定初值的变量初始化
int i=0;
char *p=NULL;
int a[10]={0}; 或 memset(a,0,sizeof(a));
六、内存越界
eg:
int a[10]={0};
for(i=0;i<=10;i++)
{
a[i]=i;
}
七、内存泄漏
问题出处:堆上由malloc或new操作符分配的内存
解决办法:使用完后及时free或delete,否者这块内存将无法释放,知道整个程序终止
八、malloc函数用法
使用要求:
1.内存分配的对象
2.分配的内存大小
3.是否还有足够内存分配
4.内存将用来存储什么格式的数据
5.分配好的内存存在哪里
void *malloc(int size);
返回值:一个void类型的指针
参数:int类型,即申请分配的内存的大小,单位是byte
内存分配成功后,malloc函数返回内存的首地址,需要一个指针来接受这个地址,但需要对指针的返回值进行强制转换
eg:
char *p=(char *)malloc(100)
可通过指针p来操作这块内存(匿名访问),malloc申请的是一块连续的内存
注:若申请分配的内存大于剩余的内存,即分配失败,函数会返回NULL。若申请的是0字节的内存,虽然返回一个正常的内存地址,但无法使用。
九、内存释放
使用free( )函数释放
功能:斩断内存和指针的关系,指针变量本身保存的地址不变,但它对这个地址处的那块内存没有使用权。
注意:释放完后,需要重新给指针定义为NULL
十、内存已经被释放了,但是继续通过指针来使用
①free(p)之后,继续通过p指针来访问内存。解决的办法就是给p置NULL。
②函数返回栈内存
③内存使用太复杂,弄不清到底哪块内存被释放,哪块没有被释放。解决的办法是重新设计程序,改善对象之间的调用关系。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)