常见的内存错误及对策
1、结构体成员指针未初始化
struct student
{
char *name;
int score;
}stu, *pstu;
int main1()
{
//stu.name =(char *)malloc(sizeof(char)) ;
strcpy(stu.name, "Jimy");
stu.score = 99;
return 0;
}
int main2()
{
pstu = (struct student *)malloc(sizeof(struct student));
//pstu->name =(char *)malloc(sizeof(char)) ;
strcpy(pstu->name, "JImy");
pstu->score = 99;
free(pstu);
return 0;
}
在定义结构体变量stu和结构体指针pstu时,只是给name这个指针变量本身分配了4字节,name指针并没有指向一个合法的地址,在访问name指针指向的地址时就会出错;
2、没有为结构体指针分配足够的内存
int main()
{
pstu = (struct student *)malloc(sizeof(struct student*));//sizeof(struct student)
strcpy(pstu->name, "JImy");
pstu->score = 99;
free(pstu);
return 0;
}
为pstu分配内存时,分配到内存大小不合适;
3、函数入口校验
4、为指针分配的内存大小
字符串结尾'\0'不能忘算
5、慎用未初始化的变量,像指针变量定义好后可以先初始化为NULL;
6、内存越界
这种错误经常是由于操作数组或指针时出现“多1”或“少1”而出现的,比如:
int a[10] = {0};
for (i = 0; i<=10; i++)
{
a[i] = i;
}
所以for循环尽量使用半开半闭区间,而且尽量从0开始;
7、内存释放之后
使用free函数释放空间后,指针变量本身保存的地址并没有改变,那就需要重新把p的值变为NULL;
对NULL指针连续free多次不会出错:
空指针:空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。C语言保证这个值不会是任何对象的地址。给指针值赋零则使它不再指向任何有意义的东西。
通用指针:通用指针,它可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。
野指针:野指针也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
8、内存已被释放,但继续通过指针来使用:
free后继续通过p指针来访问内存:给p置NULL;
函数返回栈内存,比如在函数内部定义了一个数组,却用return返回指向该数组的指针:了解栈上变量的生命周期;