簡體   English   中英

在 C++ 代碼中出現分段錯誤錯誤

[英]Getting Segmentation Fault error in C++ code

#include<bits/stdc++.h>
using namespace std;
//FIRST REPEATING ELEMENT (APPROACH 2)

int main()
{
    cout<<"running";
    int n;
    cin>>n;
    int arr[n];
    for(int i=1; i<=n; i++)
        cin>>arr[i];

    const int N = 1e5+2;
    int idx[N];

    for(int i=0;i<N;i++)
        idx[i] = -1;

    int minidx = INT_MAX;

    for(int i=0;i<n;i++)
    {
        if(idx[arr[i]] != -1)
            minidx = min(minidx, idx[arr[i]]);
        else
            idx[arr[i]] = i;
    }

    if(minidx == INT_MAX)
        cout<<"-1"<<endl;
    else
        cout<<minidx + 1<<endl;

    return 0;

}

我正在為“第一個重復元素”問題編寫此代碼,並嘗試獲取第一個重復元素的索引。 在調試時,我遇到了分段錯誤。 int main() { (在這一行)

這是什么意思,我該怎么做才能刪除它。

const int N = 1e5+2;
int idx[N];

這聽起來像是要在堆棧上分配的大數組(400kb!)。 嘗試使用 malloc() 分配該大小的數組。 將其更改為類似

const int N = 1e5+2;
int* idx = (int*)malloc(N * sizeof(int));

您也應該對arr執行相同的操作,尤其是當您使用較大的 n 值時。

該程序具有未定義的行為,因為您超出了數組的范圍。 這是因為在您的for循環條件中,您使用的是i<=n而不是i<n

未定義的行為意味着任何事情1都可能發生,包括但不限於給出預期輸出的程序。 永遠不要依賴(或基於)具有未定義行為的程序的輸出。 該程序可能會崩潰。

所以你看到的輸出(也許看到)是未定義行為的結果。 正如我所說,不要依賴具有 UB 的程序的輸出 該程序可能會崩潰。

因此,使程序正確的第一步是刪除 UB。 只有這樣,您才能開始推理程序的輸出。

此外,在標准 C++ 中,數組的大小必須是編譯時間常數。 這意味着您的程序中的以下內容不正確。

int n;
cin >> n;
int arr[n]; //not standard C++ since n is not a constant expression

1有關未定義行為的更技術上准確的定義,請參見此處提到:對程序的行為沒有限制

分段錯誤是由於使用了您不擁有的內存,或者換句話說是堆棧溢出。 很可能是因為您正在創建一個大小為 1e5+2 的數組並對其進行循環,初始化每個元素。 這不是找到元素重復的最佳方法。 而是使用帶有鍵值對的映射。

暫無
暫無

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

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