C语言学习第22篇---常见的内存错误及对策

结构体成员指针未初始化
struct student
{
    char *name;  //这里只是分配了4个字节,没有指向一个合法的地址,内部是一些乱码
    int score;
}stu,*pstu;
int main()
{
    strcpy(stu.name,"Jimy");  //所以这里会出错,解决方法就是为name指针malloc一块空间
    stu.score = 99;
    return 0;
}
另一种错误
int main()
{
    pstu = (struct student*)malloc(sizeof(struct student));//这里还是没分配name内存,只是以为分了而已。
    strcpy(pstu->name,"Jimy");
    pstu->score = 99;
    free(pstu);
    return 0;
}


没有为结构体指针分配足够的内存
int main()
{
    pstu = (struct student*)malloc(sizeof(struct student*));//这里写错了 sizeof(struct student),导致内存不足
    strcpy(pstu->name,"Jimy");
    pstu->score = 99;
    free(pstu);
    return 0;
}



函数的入口参数    assert使用



为指针分配内存太小
char *p1 = “abcdefg”;
char *p2 = (char *)malloc(sizeof(char)*strlen(p1));
strcpy(p2,p1);
p1字符串常量,长度为7个字符,但是其占内存是8个byte,因为其有结束标志  “\0”
解决方式是加上
char *p2 = (char *)malloc(sizeof(char)*strlen(p1)+1*sizeof(char));
但是只有字符串常量才有结束标志,下边就不用
char a[7] = {‘a’,’b’,’c’,’d’,’e’,’f’,’g’};




内存越界
内存分配成功,且已经初始化,但是操作越过了内存的边界。
这种错误经常是由于操作数组或指针时出现“多 1”或“少 1”。比如:
int a[10] = {0};
for (i=0; i<=10; i++)  //这里就越界了,多了一个1
{
a[i] = i;
}
所以, for 循环的循环变量一定要使用半开半闭的区间,而且如果不是特殊情况,循环变
量尽量从 0 开始。




内存泄漏-----会泄漏的就是堆上的内存

一般是 malloc 或者 new 操作符分配的内存,若用完之后没有及时 free 或者 delete ,这块内存就没法释放,知道程序结束。

(void *)malloc(int size)   //函数原型
满足五点要求就可以分配内存。

具体使用
char *p = (char *)malloc(100);   //需要强制转换类型,并且指定一个指针接收分配的内存首地址
之后就可以通过指针变量p来访问内存,内存没有名字,所以是匿名访问

存在申请失败的可能,所以应该使用
 if(NULL ! = p)
来验证内存确实是分配成功了




用 malloc 函数申请 0 字节内存,没错但不能使用




内存释放-----与malloc是“”一夫一妻制“”

函数原型   free(p);



内存释放之后,需要把p的值变为NULL,
否则会出现野指针

p = NULL;



内存已经释放之后,仍通过指针来使用







猜你喜欢

转载自blog.csdn.net/super828/article/details/80463348