2017-01-18 5 views
3

그래서 코드 시작 부분에 세그먼트 오류 오류가 나타납니다. 다른 지점에서 몇 가지 테스트를 실행 해봤는데 오류가 배열에 대한 메모리를 할당 할 때 것 같습니다. Ive는 힙과 스택 메모리에 대해 배우기 시작했기 때문에 내가 뭔가 잘못하고 있는지 확실하지 않습니다. 어떤 도움을 주시면 감사하겠습니다.세그먼트 오류 오류 11 C++

#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); 
    } 
} 
+3

이렇게 디버거를 사용하면 세그 폴트가 * 정확히 * 발생합니까? –

+2

비 동적 배열의 크기는 컴파일시 알려진 고정 크기 여야합니다. 'int size; int 배열 [크기];'불법입니다 C++. 게다가'size'가 초기화되지 않았기 때문에 segfault를 얻습니다. – DeiDei

+0

GCC 나 Clang과 같이 이것을 허용하는 컴파일러라도 비표준 확장자를 사용하고 있습니다. 가변 길이 배열은 C 표준의 (현재는 선택 사항이지만) 믿을만한 부분이지만 C++ 표준에 전혀 포함되어 있지 않습니다. –

답변

7

size을 초기화하지 않으므로 해당 변수의 값은 문자 그대로 될 수 있습니다. 크기가 과도하게 큰 경우 (예 : 106,840,406)에는 int[] 크기를 얻을 수 없습니다.

기본적으로 size 변수를 의미있는 것으로 초기화하십시오.

2

C++의 배열은 고정 크기로 초기화해야합니다. 귀하의 경우, 크기는 고정 된 정수 값으로 초기화되지 않으며, 이는 C++에서는 유효하지 않으며 컴파일러가 오류 메시지를 생성합니다. 당신이 크기 크기의 배열을 초기화하기 바로 전에 다음 줄을하려고하면

, 당신은 크기가 원래 무엇인지 알 수 있습니다 :

cout << size << endl; 

나는이 줄을 사용하여 코드를 컴파일이 INT의 크기를 가지고 컴파일러는 실패하기 전에 :

1995231824을 (이 모든 컴파일러와 컴퓨터 다르지만, 모든 수가이 하나만큼 크고 쓸모가있을 것이다)

이렇게 큰 배열을 만들려고하면 자연스럽게 세그먼트 오류가 발생합니다. 그렇기 때문에 변수 크기을 고정 숫자로 초기화해야합니다. 이렇게하면 분할 오류가 제거됩니다.