*^-^* 1个让我抓肝挠肺的BUG *^-^*

1. 认识bug:

溢出数组

这是溢出数组的异常情况,就是你自己作死,数组越界了,关键是这种异常没有报错提示,小白真的一脸懵逼!

2. bug出现的原因:

一般情况都是在做循环的时候,判断条件条件包含数组边界,而在退出循环之前,还会有一步,i++ 或者i--;于是乎就越界了。那我自己举个例子:原本定义个数组 arr[5][5], 结果在for循环的时候:

for (i = 0; i <= 4; i++)

咋一看好像也没毛病 smile 但可怕的地方就在于这里,让你看着人畜无害,压根没毛病啊!!!就是这种时候,上面那个bug出现了,让你抓肝挠肺 stuck_out_tongue_closed_eyes 不多说了,我上一条帖子做了个五子棋,跑起来很丝滑。然后有人提示我加个行列序号,很不错。我不想改太多代码,就手残在循环的判断条件加个等号,当时觉得自己太牛逼了,后来才知道,那是苦逼的开始 sob 原本没有序号的时候,棋盘规格15×15的时候 ROW = 15, COL=15, 加了序列号后,本该是16×16的,结果我懒,或者说没那个意识,没有改ROW和COL,依旧是用15, 只不过我把边界都用上了0~15,然后妥妥的在for循环的时候,board[ROW][COL]就越界了。出现了上图的bug.

3. 反省吧

以后碰到循环的时候,千万别把左右边界都用上!!!(我也不知道有没有特例),总之注意细节就好,bug都是细节不至于导致的。

bugs
123 views
Comments
登录后评论
Sign In
·

你这是循环体结束后 i 还在使用?否则不会触发越界的。循环结束后 i == 5,但你不使用 arr[i] 就不会越界。

尽量 for (int i = 0; i <= 4; ++i) 这样用,把 i 的值限制在需要的作用域内,这样不容易出岔子~

从原则上说,定义的所有变量的作用域都应当尽可能地小,能够满足使用需求的作用域就够了。在 C 中,函数内顶级的变量都需要在函数起始部分声明,做不到这一点,但 for 内限制索引变量还是没问题的。

·

C好像没办法一个比较好的办法检查数组越界,因为数组名本质就是一个指针,指针加减就是指向不同的内存,你去访问一个内存当然是可以的,比如a[i]i[a]的作用是一样的

所以用循环访问数组的时候只能小心又小心了

不过C++中就可以使用std::array替代原生数组了