今天在调试程序发现了由于数组越界造成的无法预见的错误,情况是这样的:
假设在头文件中连续定义了如下两个变量m_lAiLastTime和m_fVx(为什么要连续,因为连续的定义就意味着编译器再为这两个变量分配内存空间时候也是连续地址分配的),都是7维的,使用的时候用后面5个元素,即[2]-[6]这个6个元素,第一个元素和第二个元素[0]-[1]不使用,但由于笔误将第一个变量定义成一维数组m_lAiLastTime[1]了。
long m_lAiLastTime[1]; //应该是m_lAiLastTime[7];
float m_fVx[7];
在构造函数中对m_fVx初始化,
m_fVx[2]=99.419998
m_fVx[3]=99.730003
m_fVx[4]=100.239998
m_fVx[5]=99.440002
m_fVx[6]=100.500000
在定时器中对m_lAiLastTime[2]、m_lAiLastTime[3]、m_lAiLastTime[4]、m_lAiLastTime[5]、m_lAiLastTime[6]这5个数进行赋值操作,
结果就会神奇的发现m_fVx[2]、m_fVx[3]、m_fVx[4]、m_fVx[5]这四个数被修改成零了。TRACE输出:
m_fVx[2]=0.000000
m_fVx[3]=0.000000
m_fVx[4]=0.000000
m_fVx[5]=0.000000
m_fVx[6]=100.500000
原因就在于m_lAiLastTime[1]至m_lAiLastTime[6]这个6个元素侵犯了m_fVx[0]至m_fVx[5]这6个元素的内存空间,造成m_fVx[0]至m_fVx[5]这6个元素的值被破坏。
奇怪的是为什么编译器不能发现这么明显的错误呢?! 明明只定义了m_lAiLastTime[1],却使用了m_lAiLastTime[2]、m_lAiLastTime[3]、m_lAiLastTime[4]、m_lAiLastTime[5]、m_lAiLastTime[6]这些明显越界的数组。