簡體   English   中英

程序 std::sort 每一端的分段錯誤

[英]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 並且沒有出錯。 變更清單;

  1. 新的整數(N)。 ---> 新的 int[N]

  2. 排序(arr,arr + N-1,... --> 排序(arr,arr + N,...

  3. 對於排序,您也可以刪除比較方法,除非您想以不同的方式排序。

  4. sort(arr, arr+ Nx) 或 sort(arr, arr+ Nx, compare) --> 它們只會對數組的前 Nx 個元素進行排序。

  5. 錯過了刪除,在 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.

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