off-by-one(大小差一)错误介绍

详细了解请移步这里

off-by-one,大小差一错误是一类常见的程序设计错误。这方面有一个经典的例子OpenSSH.去Google搜索关键词“OpenSSH off-by-one”可以了解相关状况。具体来说,

1. if(id < 0 || id > channels_alloc)...
2. if(id < 0 || id >= channels_alloc)...

第二句应该是正确的写法。举个更通俗的例子:

int a[5],i;
for(i = 1;i < = 5;i++)
    a[i]=0;

上述代码定义了长度为5的数组a,循环的目的是给数组元素初始化,赋值为0.但是,循环下标从1开始到5,出现了a[5]=0,这样的不存在的数组元素.这就是典型的“差一错误”(off-by-one).其实,貌似说栅栏柱错误(fencepost error)大家更熟悉。我问过身边的朋友,很多人知道这个问题。
如果你要建造一个100米长的栅栏,其栅栏柱间隔为10米,那么你需要多少根栅栏柱呢?11根或9根都是正确答案,这取决于是否要在栅栏的两端树立栅栏柱,但是10根却是错误的。 我想起来了我高中是数学老师告诉我们的一个很容易犯错的数学题目。从周一到周五一共有几天?也许你立即反应5-1=4,但是,下意识你也会说五天,实际上应该是5-1+1=5.转换到数学,数字1到数字5一共有几个数字?这里有一个公式 
从M到N,一共有 M-N+1 项.

这个问题写出来后很简单,只不过在写代码的时候,往往比较容易忽略。尤其在涉及到数组操作两端界限的时候,如果不是从0开始计数,就要稍微考虑一下咯。

转载时请注明本文出处 
本文链接地址:https://www.tomytime.com/archives/224

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值