2017-01-18 98 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(这不同于每一个编译器和电脑,但每一个数字会随着大和无用的,因为这一个)

试图拥有这么大的阵列自然会导致分段错误。这就是为什么你必须初始化变量大小到一个固定的数字。这将消除分段错误。