今天在项目中,发现了一个由于数组越界访问的BUG。数组越界访问的结果是未定义的,在大多数情况下,会出现空指针异常。
但是如果在结构体中,两个数组的内存分配是连续的。为了示例方便,我将代码做了简化,例如如下面的test结果体中,数组a和数组b的内存是连续的,也就是说a[9]后面跟的就是b[0].
因此在访问a的时候,如果数组越界,就会访问到数组b中,例如a[29]=b[19]; 因此如果不对a的数组访问进行下标校验,将会从b中取得数据,如果在对a赋值时越界,将会对b中的数据进行修改,这将会带来调试的巨大麻烦,表现形式是b数据在某个地方被修改了。
- struct test
- {
- int a[10];
- int b[200];
- };
- int main()
- {
- struct test t;
- int result;
- for(int i=0;i<200;i++)
- {
- t.b[i]=i+1;
- }
- printf("the result is %d",result);
- return 0;
- }
因此,切记在访问或者操作数组时,一定要对数组下标进行校验,例如上面的例子可以修改为:
- if(index<10&&index>=0)
- {
- result=a[index]);
- }