2015-11-04 35 views
-2

,而我是通過STL今天去,我碰到的情況下我的動態分配的數組從arr[0],,..arr[n-1]排序來了。我用命令訪問未分配的內存,同時從算法STL C++排序

#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]' 在第一代碼段的工作。

+1

我不明白這個問題。用n代表n個元素,用n-1排序,它只排序n-1,好的,那麼是什麼?你只訪問n-1個元素的情況是UB。 – deviantfan

+1

你不能閱讀'std :: sort'的文檔嗎?這種事情是不允許的嗎? – juanchopanza

+0

對不起,我將從現在開始閱讀文檔:) –

回答

0

使用C++編寫索引爲0的數組。如果您有n元素,則第一個索引是0,最後一個索引是n-1

這是工作,因爲它是不確定的行爲。它可以做任何事情。通常會發生什麼,你只是用廢話覆蓋堆棧上的一些變量。如果它是正確的變量,這可以允許某人用目標廢話來重載該緩衝區並導致代碼被執行。它被稱爲「緩衝區溢出」,你需要避免它們。

+0

所以我在這裏經過的arr [n]有時會顯示錯誤? –

+2

'&arr [n]'不是未定義的行爲,因爲只要您避免對其進行解引用(參見C++標準中的第5.7節),'(arr)+ n'就是有效的。因此,對C數組使用std :: algorithm通常是有效的。 – bjhend

+0

我對發生了什麼感到困惑,但除非他們在C++ 11或更高版本中改變它,否則'&arr [n]'是未定義的,因爲那裏有一個取消引用。他們用C合法化了它,所以C++可能會吸收這種變化。 –

2

STL算法使用「半開」的範圍。這意味着它包含了第一個元素,並且可以滿足 - 但不包括 - 最後一個元素。鑑於:

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

排序功能的元素進行排序從0n - 1。它永遠不會試圖在arr[n]

在C和C++,是合法的創建一個指向超出數組末尾的第一個元素,但你不能解引用該指針。

當你改變了呼叫:您介紹了一個錯誤,因爲排序時,這將忽略該數組的最後一個元素

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

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