C++教程之指向数组尾边界的内存

来源:互联网 发布:ubuntu卡在安装界面 编辑:程序博客网 时间:2024/06/03 20:31

翻译原文:

C++ Tutorial: The Do's and Don'ts of Accessing One Element Past the End of an Array

Danny Kalev
March 11, 2011

原文地址

 

介绍

直观上,安全的数组操作是不访问一个数组有效边界之外的元素。但是,有些场合,如遍历一个数组或者执行一系列元素操作的算法时,就有可能需要利用指向数组尾边界之外(译者注:数组尾边界之外的内存指的是数组尾部第一个访问非法地址)的内存。这有反于我们的常理,但C++的确允许这样的操作,但你使用的时候也必须非常小心,并且遵守一些重要的限制。

 

数组排序

利用指向数组尾边界之外内存地址的场合比你想象的要多。例如你有一个整型数组,你想通过std::sort算法来进行排序:

sort()函数要求两个前向迭代器(数组指针是有效的迭代器)作为参数:一个迭代器指向一系列元素的第一个,另一个则指向这个序列的最后。我们可以注意到,这里所指的 序列最后 并不是指向序列最后一个有效元素,也就是arr[4],而是数组尾边界之外内存地址:arr+5。任何对arr+5内存地址的解引用都会导致未定义的操作行为。但是,arr+5地址本身可有效地作为sort函数参数,完成排序操作。

 

有效与无效的操作
只要不对数组尾边界之外的内存地址进行读写,你就可以安全地利用这一特殊的地址指向。当然,你也不被允许对这一指针再进行增加操作。但是,你可以对这一指针在算术表达式中做减少操作或者在比较表达式中使用。如下例:

一般来说,arr+5只允许用来作为指针指向,不允许做解引用。

 

 

总结

在特定环境下,使用指向数组尾边界之外的内存是一种有效的操作。但你只能将它用在指针算术操作中访问数组有效元素或者用于比较表达式,不允许对该地址做解引用或者进一步增加操作。值得注意的是STL中非常频繁地使用这种惯用法。end()函数的作用就是返回一个指向这一特殊内存地址的迭代器。同样,你也只能将end()返回的结果用于指针算术操作访问有效元素与比较表达式。

 

 

原创粉丝点击