所以我在代码的开头出现了分段错误错误。我尝试在不同的点运行一些测试,错误似乎是我为数组分配内存。我刚刚开始学习堆和堆栈内存,所以我不确定我是否在那里做错了。任何帮助将不胜感激。
#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);
}
}
答案 0 :(得分:9)
因为你没有初始化size
,所以该变量中的值可以是任何东西。如果它碰巧过大,比如说106,840,406,那么你就不可能获得那个大小的int[]
。
基本上,将您的size
变量初始化为合理的变量。
答案 1 :(得分:2)
c ++中的数组必须以固定大小初始化。在您的情况下,size不会初始化为任何固定的整数值,这在c ++中是非法的,并且会导致编译器产生错误消息。
如果您在初始化 size 大小的数组之前尝试以下行,则可以告诉原始大小:
cout << size << endl;
我使用这一行编译你的代码并在编译器失败之前得到这个int大小:
1995231824(这对于每个编译器和计算机都不同,但每个数字都会像这个一样大而无用)
尝试拥有如此庞大的阵列自然会导致分段错误。这就是为什么你必须将变量 size 初始化为固定数字的原因。这将消除分段错误。
答案 2 :(得分:0)
分段错误11等于说“索引超出范围” ...
Index
0, 1, 2, 3, 4 ,5
值5,6,1,9,8,7
数组长度为6,但其最后一个索引为5。例如,如果我们将for周期控制为6,则得到Segmentation Fault 11 ...