[英]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.