このエラーに関するいくつかの質問がstackoverflowにありますが、配列による過剰なメモリ使用やポインタを使用しているとわかっています)、小さな配列を使用しても、このエラーは表示されます。先ほどの同じコードがうまくいきました(配列のマージソート用)。セグメンテーションフォールト:配列/ベクトルの小入力の場合は、
出力:
次のようにセグメンテーション障害:11
私の入力がありました
#include<iostream>
#include<vector>
using namespace std;
void merge(vector <int> ar, int l, int m, int r){
int n1 = m-l+1;
int n2 = r-m;
int L[n1];
int R[n2];
for (int i = 0; i < n1; ++i)
{
L[i]=ar[l+i];
}
for (int j = 0; j < n2; ++j)
{
R[j]=ar[m+j+1];
}
int i,j;
i = j = 0;
int k = i;
while(i<n1 && j<n2){
if (L[i]<R[j])
{
ar[k]=L[i];
i++;
}
else if (R[j]<L[i])
{
ar[k]=R[j];
j++;
}
k++;
}
while(i<n1){
ar[k]=L[i];
i++;
k++;
}
while(j<n2){
ar[k]=R[j];
j++;
k++;
}
}
void mergesort(vector <int> ar, int l, int r){
int m;
m=r+(l-r)/2;
if (l<r)
{
mergesort(ar, l, m);
mergesort(ar, m+1, r);
merge(ar, l, m, r);
}
}
void print(vector <int> ar, int size){
for (int i = 0; i < size; ++i)
{
cout<<ar[i]<< " ";
}
}
int main()
{
int n;
cin>>n;
vector <int> ar;
for (int i = 0; i < n; ++i)
{
cin>>ar[i];
}
print(ar,n);
mergesort(ar, 0, n-1);
print(ar, n);
return 0;
}
は、デバッガを介してこれを実行した:
l
とr
が1によって異なる場合あなたがそうのように、ポイントを取得する場合や、あなただけの2つの要素を入れ替えることができますか? –あなたが知っているように、 'int ar [n];'は非標準のC++であり、あなたのコンパイラが許可していてもそれを使うことができるとしても、本当に使用すべきではありません。また、ここにコードを掲載する場合は、変数をより良い名前にする必要があります。 – Xirema
はい、私はそれをデバッガで実行しました。 より良い変数名でベクトルを再投稿し、ベクトルを使う@Xirema –