そのため、コードの先頭にセグメンテーション違反エラーが発生します。さまざまなポイントでいくつかのテストを実行しようとしましたが、アレイにメモリを割り当てたときにエラーが発生したようです。ヒープとスタックメモリについて学び始めたばかりなので、そこで何か間違ったことをしているのかどうかはよくわかりません。どんな助けでもいただければ幸いです。
#include <iostream>
using namespace std;
//Function Prototypes
void sort(int A[], int n);
int findMin(int A[], int n, int j);
int swap(int& a, int& b);
double median(int A[], int n);
void output1(int median);
void output2(double median);
int main()
{
int size;
int array[size]; //Segmentaion fault here
int i = 0;
cout << "Enter the size of the list (< 1 to quit): ";
cin >> size;
while(size >= 1)
{
double element;
cout << "Enter element " << i+1 << ": ";
cin >> element;
array[i] = element;
i++;
while(i < size)
{
cout << "Enter element " << i+1 << ": ";
cin >> element;
array[i] = element;
i++;
}
sort(array, size);
median(array, size);
cout << "Enter the size of the list (< 1 to quit): ";
cin >> size;
}
delete [] array;
return 0;
}
void sort(int A[], int n)
{
int min;
for(int i = 0; i < n; i++)
{
min = findMin(A,n,i);
//min = findMinIndex(p, size, i);
//if(min )
swap(A[i],A[min]);
//swap(p[i],p[min]);
}
}
int findMin(int A[], int n, int j)
{
int minIndex = j;
for(int i = j+1; i < n; i++)
if(A[i]<A[minIndex])
minIndex = i;
return minIndex;
}
int swap(int& a, int& b)
{
int temp;
temp = a;
a = b;
b = temp;
}
void output1(int median)
{
cout << "The median is " << median << "." << endl;
}
void output2(double median)
{
cout << "The median is " << median << "." << endl;
}
double median(int A[], int n)
{
if(n % 2 == 0)
{
int div1 = n / 2;
int num1 = A[div1];
int num2 = A[div1 -1];
double median = (num1 + num2) / 2;
output2(median);
}
else
{
int div2 = n - 1;
int median = div2 / 2;
output1(median);
}
}
size
を初期化していないため、その変数の値は文字通り何でもかまいません。たまたま106,840,406のように大きすぎると、そのサイズのint[]
を取得できなくなります。
したがって、基本的には、size
変数を適切なものに初期化します。
C++の配列は、固定サイズで初期化する必要があります。あなたの場合、サイズは固定整数値に初期化されていません。これはC++では違法であり、コンパイラーがエラーメッセージを生成する原因になります。
サイズsizeの配列を初期化する直前に次の行を試してみると、元のサイズがわかります。
cout << size << endl;
私はあなたのコードをこの行でコンパイルし、コンパイラが失敗する前にこのintサイズを取得しました:
1995231824(これはコンパイラとコンピュータごとに異なりますが、すべての数値はこれと同じくらい大きくて役に立たないでしょう)
このような大きな配列を作成しようとすると、当然、セグメンテーション違反が発生します。そのため、変数sizeを固定数に初期化する必要があります。これにより、セグメンテーション違反が解消されます。
セグメンテーション違反11は、「インデックスが範囲外です」と同じです。
Index
0, 1, 2, 3, 4 ,5
値5、6、1、9、8、7
配列の長さは6ですが、最後のインデックスは5です。たとえば、forサイクルを6で制御すると、セグメンテーション違反11が発生します。