【问题标题】:Segmentation fault error 11 C++分段错误错误 11 C++
【发布时间】:2017-01-18 21:31:47
【问题描述】:

所以我在代码的开头遇到了分段错误错误。我尝试在不同的点运行一些测试,错误似乎是当我为数组分配内存时。我刚刚开始学习堆和堆栈内存,所以我不确定我是否在那里做错了什么。任何帮助将不胜感激。

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

【问题讨论】:

  • 那么,使用调试器,究竟在哪里发生了段错误?
  • 非动态数组的大小必须具有在编译时已知的恒定大小。 int size; int array[size]; 之类的东西是非法的 C++。另外,您会收到段错误,因为 size 未初始化。
  • 请注意,即使使用允许这样做的编译器(例如 GCC 或 Clang),您也使用的是非标准扩展;虽然可变长度数组是(目前是可选的,我相信)C 标准的一部分,但它们根本不在 C++ 标准中。
  • this 可以帮助您找出谁触发了异常。

标签: c++ c++11 segmentation-fault


【解决方案1】:

因为您没有初始化size,所以该变量中的值实际上可以是任何值。如果它恰好过大,比如 106,840,406,那么您将无法获得该大小的 int[]

所以基本上,将您的 size 变量初始化为合理的值。

【讨论】:

    【解决方案2】:

    Segmentation Fault 11 等于说“索引超出范围”...

                   Index
    
             0, 1, 2, 3, 4 ,5
    

    值 5, 6 ,1 ,9 ,8 ,7

    数组长度是6,但它的最后一个索引是5..例如,如果我们用6控制一个for循环,那么我们得到Segmentation Fault 11......

    【讨论】:

    • 这就是我喜欢stackoverflow的原因
    【解决方案3】:

    c++ 中的数组必须以固定大小初始化。在您的情况下, size 未初始化为任何固定整数值,这在 c++ 中是非法的,并且会导致编译器产生错误消息。

    如果您在初始化大小为 size 的数组之前尝试以下行,您可以知道原来的大小是多少:

        cout << size << endl;
    

    我用这一行编译了你的代码,并在编译器失败之前得到了这个 int 大小:

    1995231824(每个编译器和计算机都不同,但每个数字都会像这个一样大而无用)

    试图拥有这么大的数组自然会导致分段错误。这就是您必须将变量 size 初始化为固定数字的原因。这将消除分段错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多