[英]segmentation fault on every end of program std::sort
Window 64位
gcc 6.3.0
代碼
#include <algorithm>
#include <iostream>
using namespace std;
bool compare(int a, int b) {
return a <= b;
}
int main() {
int N;
cin >> N;
int *arr = new int(N);
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
sort(arr, arr + N - 1, compare);
for (int i = 0; i < N; i++) {
cout << arr[i] << '\n';
}
}
我的代碼的第一個版本是sort(arr,arr+N,compare)
但似乎有可能對未分配的 memory 進行越權,所以我將其更改為arr+N
-> arr+N-1
仍然面臨Segmentation fault
我想知道為什么會出現這個錯誤
接受了thesturgler的評論並做了這個
#include <algorithm>
#include <iostream>
using namespace std;
bool compare(int a, int b) {
return a <= b;
}
int main() {
int N = 0;
cin >> N;
if (N < 1) return 1;
int *arr = new int[N];
for (int i = 0; i < N; ++i) {
cin >> arr[i];
}
sort(arr, arr + N, compare);
for (int i = 0; i < N; ++i) {
cout << arr[i] << '\n';
}
delete [] arr;
return 0;
}
添加了對N
值和return
語句的錯誤檢查。
這可能取決於您的編譯器,但我對您的代碼進行了細微更改以解決潛在問題。 我在 VS 中使用了 -std=c++11 和 -std=c++14 並且沒有出錯。 變更清單;
新的整數(N)。 ---> 新的 int[N]
排序(arr,arr + N-1,... --> 排序(arr,arr + N,...
對於排序,您也可以刪除比較方法,除非您想以不同的方式排序。
sort(arr, arr+ Nx) 或 sort(arr, arr+ Nx, compare) --> 它們只會對數組的前 Nx 個元素進行排序。
錯過了刪除,在 C++ 中,對於任何新的你應該有一個刪除對。 這是一個小例子,但在較大規模的代碼中或每當您擔心 memory 時,它可能會導致一些問題。 您可以釋放 memory,如 arrays 的“delete[] arr”。 更多細節
#include <algorithm>
#include <iostream>
using namespace std;
bool compare(int a, int b) {
return a <= b;
}
int main() {
int N;
cin >> N;
int *arr = new int[N];
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
for (int i = 0; i < N; i++) {
cout << arr[i] << " ";
}
cout<<"\nafter sorting will be\n";
//sort(arr, arr + N);
sort(arr, arr+N-1, compare);
for (int i = 0; i < N; i++) {
cout << arr[i] << " ";
}
delete[] arr;
cout<<endl;
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.