从算法stl c ++中排序时访问未分配的内存

时间:2015-11-04 22:22:58

标签: c++ arrays algorithm sorting stl

当我今天经历stl时,我遇到了从arr[0],,..arr[n-1]对我动态分配的数组进行排序的情况。我正在使用命令

#include<algorithm>
.
.
int *arr = new int[n]();
//loop to take user input for each arr[i]
sort(&arr[0],&arr[n]) 

上面的命令正在排序数组而没有任何错误,即使我已经分配了最多arr[n-1]的内存。

以下命令正在排序到第n-1个元素。

#include<algorithm>
.
.
int *arr = new int[n]();
//loop to take user input for each arr[i]
sort(&arr[0],&arr[n-1]) 

'&arr[n]'如何在第一个代码段中工作。

2 个答案:

答案 0 :(得分:2)

STL算法使用&#34;半开&#34;范围。这意味着它包含第一个元素,并且最多可以 - 但不包括 - 最后一个元素。给出:

std::sort(&arr[0], &arr[n]);

sort函数会将元素从0排序到n - 1。它绝不会试图查看arr[n]

在C和C ++中,创建指向超出数组末尾的第一个元素的指针是合法的,但是你不能取消引用该指针。

将通话更改为:

std::sort(&arr[0], &arr[n-1]);

你引入了一个错误,因为这会在排序时忽略数组中的最后一个元素。

使用半开范围(或间隔)非常自然,因为数组的索引是从0开始的。

答案 1 :(得分:0)

数组在C ++中被索引为0。如果您有n个元素,则第一个索引为0,最后一个为n-1

它正在运行,因为它是未定义的行为。它可以做任何事情。通常情况是你只是用废话覆盖堆栈上的某个变量。如果它是正确的变量,这可以允许某人使用目标无意义重载该缓冲区并导致代码被执行。它被称为“缓冲区溢出”,你需要避免它们。