1、常见内存错误
结构体成员指针未初始化
结构体成员指针未分配足够的内存
内存分配成功,但并未初始化
内存操作越界
2、实例分析
常见内存错误 42-1.c 42-2.c42-1.c
- #include <stdio.h>
- #include <malloc.h>
- void test(int* p, int size)
- {
- int i = 0;
- for(i=0; i<size; i++)
- {
- printf("%d\n", p[i]);
- }
- free(p);
- }
- void func(unsigned int size)
- {
- int* p = (int*)malloc(size * sizeof(int));
- int i = 0;
- if( size % 2 != 0 )
- {
- return;
- }
- for(i=0; i<size; i++)
- {
- p[i] = i;
- printf("%d\n", p[i]);
- }
- free(p);
- }
- int main()
- {
- int* p = (int*)malloc(5 * sizeof(int));
- test(p, 5);
- free(p);
- func(9);
- func(10);
- return 0;
- }
错误1:在test函数free(p)
原因:在哪个函数申请的空间,应在那个函数释放
解决://test()中的free(p)
错误2:在func函数产生内存泄漏
原因:若size为奇数,直接返回,未释放p
42-2.c
- #include <stdio.h>
- #include <malloc.h>
- struct Demo
- {
- char* p;
- };
- int main()
- {
- struct Demo d1;
- struct Demo d2;
- char i = 0;
- for(i='a'; i<'z'; i++)
- {
- d1.p[i] = 0;
- }
- d2.p = (char*)calloc(5, sizeof(char));
- printf("%s\n", d2.p);
- for(i='a'; i<'z'; i++)
- {
- d2.p[i] = i;
- }
- free(d2.p);
- return 0;
- }
3、内存操作的交通规则
动态内存申请之后,应该立即检查指针
值是否为NULL , 防止使用NULL指针。
free指针之后必须立即赋值为NULL。
任何与内存操作相关的函数都必须带长度信息。
malloc操作和free操作必须匹配, 防止内存泄露和多次释放。
4、小结
内存错误的本质源于指针保存的地址为非法值
- 指针变量未初始化,保存随机值
- 指针运算导致内存越界
内存泄漏源于malloc和free不匹配
-当malloc次数多于free时,产生内存泄漏
-当malloc次数少于free时,程序可能崩溃