c语言中出现内存错误的常见案例,c语言项目案例分析,c语言内存分配,c语言课程设计案例,c语言内存管理,c语言动态内存分配,c语言申请内存,c语言内存模型,c语言案例,c语言释放内存
c
c
cc 语言中出现内存错误的常见案例:
大家好,最近一直在学习c/c++,发现进行定期的总结很有必要,故发帖希
望能够征集c/c++中常见的错误分析及解决方案,希望与一些志同道合的朋友共
同学习,在此,我先抛砖引玉,分析一下常见的内存错误:
1)
1)数组溢出。
11))
如:
void main()
{
int a[5];
a[5] = 8;
printf("%d\n",a[5]); //数组是取不到a[5]的
}
对于初学者来说经常会犯这样的错误,一定要记住 inta[5]是从a[0]到a[4]
的,这一点我就不多说了,大家都知道的,呵呵。
2) ( )
2) ( )
22))程序中存在野指针((即未初始化的指针))。
例如:
void fn(int data)
{
int *p2;
*p2 = data;
...
}
在未对指针初始化或者附初值(地址)的情况下,就没有对其分配空间,这种
错误比较明显,但是大家一定得养成一个良好的习惯,定义变量的时候记得进行
初始化。
3)
3)在函数调用的时候没有注意到变量的生
33))
存期
看下面例子:
#include
#include
void int_malloc(int *);
void main()
{
int i, *ip = NULL;
for(i = 0; i < 10; i++)
{
printf("%-4d",*(ip+i));
}
printf("\n");
}
void int_malloc(int *ip)
{
int i;
ip = (int *)malloc(sizeof(int)*10);
for(i = 0; i < 10; i++)
{
*(ip+i) = i;
}
}
开始是这样分析的:
作者的意图是在子函数中动态分配内存空间,在主函数中输出,这个时
候你就得注意陷阱了,原因是子函数运行完了刚分配的空间也就释放了,即使你
将将动态数组的首地址传回给main()函数也无济于事,我东西都不存在了你还
指望干什么?在写程序的过程中一定切记要注意变量的生存期(就是它什么时候
存在,什么时候消亡)。
这样分析似乎并不正确,无法在main()函数中输出动态数组的原因并
不是字函数完了内存就释放了,而是在参数中是无法将动态数组的首地址传回
main()的,只要我不释放,那刚申请的内存空间就不会自动释放,只有遇到free()
的时候才释放,另外,通过返回值是可以做到在主函数里面输出的,也就是这样
的形式 int *fn(int *m1,int *m2)是可以将r的首地址传回main并且可以成功
输出!请大家不要受我上面的错误分析的影响!
4)
4) 发生内存泄露
44))
引起内存泄露主要是因为在分配内存没有释放或者读入文件后没有关
闭,所以说习惯是很重要的,还有一点值得提醒一下,一定不要打开和关闭文件
(fopen()和fclose放在循环里面),过多的使用free()和fclose可能回引起内
存错误。
5)常量的修改:
char *p1 = "abcde";
char *p2 = "12345";
strcpy(p1,p2);
一般情况下解释有两种原因:未对p1分配内存,它指向的只是一个常量字符
串,其值是不能被修改的!
引起内存错误的原因还有很多,但是我自己目前就遇到这些。我真诚的
希望大家能够互相交流,互相学习,将自己的错误