2017-01-18 33 views
3

所以我在代碼的開頭部分遇到了分段錯誤錯誤。我試過在不同的地方運行一些測試,錯誤似乎是當我爲數組分配內存時。我剛開始學習堆和堆棧內存,所以我不確定我在那裏做錯了什麼。任何幫助,將不勝感激。分段錯誤錯誤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 array [size];'是非法的C++。另外你會得到segfault,因爲'size'沒有被初始化。 – DeiDei

+0

請注意,即使使用允許此操作的編譯器(例如GCC或Clang),也使用非標準擴展;雖然可變長度數組是C標準的一部分(我相信是可選的),但他們根本不在C++標準中。 –

回答

7

由於您未初始化size,該變量中的值可能實際上是任何值。如果碰巧過大,例如106,840,406,那麼您將無法獲得該尺寸的int[]

所以基本上,初始化size變量是明智的。

2

C++中的數組必須用固定大小進行初始化。在你的情況下,大小不會初始化爲任何固定的整數值,這在C++中是非法的,並且會導致編譯器產生錯誤消息。

如果您嘗試以下行初始化大小大小的陣列之前,你可以告訴尺寸本來就是:

cout << size << endl; 

我編譯你的代碼與這條線,並得到這個INT大小之前編譯失敗:

1995231824(這不同於每一個編譯器和電腦,但每一個數字會隨着大和無用的,因爲這一個)

試圖擁有這麼大的陣列自然會導致分段錯誤。這就是爲什麼你必須初始化變量大小到一個固定的數字。這將消除分段錯誤。