[英]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 函數將從0
到n - 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.