一个有意思的bug

最近在做图中路径查找的算法。
前一个版本中,算法需要动态的将一些边标记为不可信任。于是我给边的定义添加了一个字段。如下

int edges[MAX_EDGE_NUM][4]; //[边序号] 0:权重 1:起点 2:终点 3:是否可信赖

到了下一个版本的算法中,不在需要这个不可信赖字段了,于是我从边的数据结构中删掉了这个字段。

int edges[MAX_EDGE_NUM][3]; //[边序号] 0:权重 1:起点 2:终点

然后写好了一个及其复杂的算法,但不能工作。然后就debug。
debug追了半天,发现有一个全局变量demand_vertex_num的值初始化错误。然后就发现了灵异事件。每次刚开始初始化时,还没有初始化demand_vertex_num时,它就莫名其妙的被赋值为1.
继续追踪,发现,当初始化进行到edges的最后一条边时,这时demand_vertex_num就被置为1.
我兴奋了,以为自己找到了VS的一个bug。
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

然后定睛一看,初始化倒数第二条边时,最后一条边的最后一个字段突然有了值。
原来edges[len-2][3]直接跑到了edges[len-1][0]的位置。
所以,初始化edges[len][3]时,全局变量区访问越界了,而下一个变量刚好是demand_vertex_num,所以它被莫名其妙的赋了初值。

但是为何,二维数组访问越界,VS没有提示呢?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章