Skip to Content
C++程序设计:原理与实践(基础篇)(原书第2版)
book

C++程序设计:原理与实践(基础篇)(原书第2版)

by 本贾尼 斯特劳斯特鲁普
August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
Pearson
Content preview from C++程序设计:原理与实践(基础篇)(原书第2版)

5.6.2 范围错误

大多数实际程序都需要处理数据集合,即,会用各种类型的数据元素的表格、列表等来完成某项任务。在C++语言中,我们一般把“数据集合”称为容器(container)。最常用的标准库容器是4.6节中介绍的vector。一个vector中包含了一组数据。我们可以通过vector的成员函数size()来获得数据的个数。如果我们引用了一个不在有效范围[0:v.size())内的下标的话,会出现什么情况呢?需要注意的是[low:high)表示从low到high-1的下标范围,它包括low但不包括high:

在回答上面的问题前,我们先看看另外一个问题和它的答案:

“为什么要这么做呢?”毕竟,你应该明白下标只能在范围[0:v.size())内,因此确保如此就可以了呀!

话虽然是这么说的,但是实际上,很难保证这种情况不会发生。看看下面这个似乎合理的程序:

你看出问题了么?试着把它识别出来。这不是一个一般性的错误。这种错误往往是由我们自身的原因导致,特别是在工作到很晚我们很累的时候。当我们很劳累或者很毛躁的时候,这类错误经常会出现。在我们对v[i]进行操作时候,我们用0和size()来保证i总是在合法的范围内。

不幸的是,我们犯了一个错误。仔细看看for循环:它的终止条件是i<=v.size()而不是i<v.size()。这会导致一个不幸的结果:如果我们读入了5个整数,它会试图输出6个结果。因为我们试图读v[5]的值,而它已经超出了vector的存储空间范围。这类错误是非常普遍的而且很“出名”,人们为它起了很多名字:偏一位错误(off-by-one ...

Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Start your free trial

You might also like

C++语言导学(原书第2版)

C++语言导学(原书第2版)

本贾尼 斯特劳斯特鲁普
管理Kubernetes

管理Kubernetes

Brendan Burns, Craig Tracey
Go程序设计语言

Go程序设计语言

艾伦A. A.多诺万, 布莱恩W. 柯尼汉

Publisher Resources

ISBN: 9787111562252