簡體   English   中英

從算法stl c ++排序時訪問未分配的內存

[英]accessing unallocated memory while sort from algorithm stl c++

當我今天通過 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] ' 在第一個代碼片段中是如何工作的。

STL 算法使用“半開”范圍。 這意味着它包含第一個元素並一直工作到——但不包括——最后一個元素。 鑒於:

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

sort 函數將從0n - 1對元素進行排序。 它永遠不會嘗試查看arr[n]

在 C 和 C++ 中,創建指向數組末尾之外的第一個元素的指針是合法的,但您不能取消引用該指針。

當您將呼叫更改為:

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

您引入了一個錯誤,因為這將在排序時忽略數組中的最后一個元素。

考慮到數組從 0 開始索引,使用半開范圍(或間隔)是很自然的。

數組在 C++ 中索引為 0。 如果您有n元素,則第一個索引為0 ,最后一個為n-1

它有效,因為它是未定義的行為。 它可以做任何事情。 通常發生的事情是你只是用廢話覆蓋了堆棧上的一些變量。 如果它是正確的變量,這可以允許某人用有針對性的廢話重載該緩沖區並導致代碼被執行。 它被稱為“緩沖區溢出”,您需要避免它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM