现在的位置: 首页 > 综合 > 正文

C中防内存溢出

2017年01月08日 ⁄ 综合 ⁄ 共 879字 ⁄ 字号 评论关闭
       c语言是一门成功的语言,但也是一门有很多不足之处的语言。其中,对数组、指针的操作尤其容易导致溢出。
一旦溢出程序运行结果千奇百怪,查找问题相当困难。这要求在刚开始码代码的时候就要非常注意细节问题,下面
列出部分个人觉得最容易导致溢出的细节问题,一定一定注意回避这些问题:
       首先,C语言溢出都是发生在对一段内存块进行操作时,由于某种意外导致超出了权限范围所导致的。表现
式为a[i++]或*p++。大致可分为以下三种:

第一:
形式如:
int arr[100];
arr[i++] = j;
之类的语句,必须加上防溢出判断:
i = i > 99 ? 99 : i;
,这种情况下,如果:
1、在同一个函数内有多处地方对这个数组执行这种操作,最好定义一个枚举enum {ARRMAXLEN = 100} arrMaxLen;
2、在不同函数内有多处地方对这个数组执行这种操作,最好定义一个宏:#define ARRLEN 100。
3、当然,用const unsigned int ARRLEN = 100;更好。
int arr[ARRLEN];可以方便的更改数组大小。
以方便以后修改这个数组的容量。
第二:
任何地方引用指针变量之前,一定要保证指针的合法性,无论这个指针是函数参数传进来的,还是全局变量!
如:
1、 不要对NULL指针进行读/写操作。
2、 不要让指针有成为野指针的机会。为保证这点,刚声明的指针要记得初始化,即使只是初始化为NULL;用
        函数free()释放动态分配的数组后,一定要把指针赋值为NULL。
第三:
形式如:
int a[100];
int d[100];
for (i=0; i<100; i++, j++)
{
    .......
    a[i] = b;
    c = d[j];
//    i++;                            // 最好不要在循环体内增加i的值。
//    if (i >= 100) break;    // 若不得不这样做,则最好像这样检查i的合法性
}
while和do...while同理。

第四:
少用strcpy,改用strncpy。
任何时候都要严格按照这样做,不然你会像我现在这么痛苦!!!
【上篇】
【下篇】

抱歉!评论已关闭.