未知的分段错误

时间:2014-07-18 14:01:05

标签: c++ segmentation-fault

我有两个函数用于计算给定数字集的范围。

  • 跨度的定义:给定向量X,X [i]的跨度S [i]为 紧接在前的连续元素X [j]的最大数量 X [i]使得X [j] <= X [i]。

    例如:

  • X:6 3 4 5 2
  • S:1 1 2 3 1

我试图以两种方式实现该算法。第一种方法是不使用堆栈ADT,第二种方法是使用堆栈ADT;但是,使用这两种算法我都会遇到分段错误,而我无法弄清楚原因!任何帮助将不胜感激!

/*Stack.cpp
Implementation of the Stack class.
*/

#include "Stack.h"

....

vector<int> spans1(vector<int>& x) {

    int j = 0;
    vector<int> s;

    for( int i = 0; i < x.size()-1; i++ ) {
        j = 1;
        while( j <= i && x[i-j] <= x[j] )
            j++;
        s[i] = j;
    }

    return s;
}

vector<int> spans2(vector<int>& x) {
Stack t;
vector<int> span;
int j = 0;

for( int i = 0; i < x.size()-1; i++ ) {
    do {
        if( t.isEmpty() == true ) j = -1;
        else j = t.pop();  //removes the element at the top of the stack
    } 
    while( j != -1 && x[i] >= x[j] );

    span[i] = i - j;
    if( j != -1 ) t.push( j );
    t.push( i );
}

return span;

}

// --------------------------------------------- --------------------------------

/*Main.cpp
Tests all functionality of the Stack class.
*/

#include <iostream>
#include <stdexcept>
#include "Stack.h"

int main() {
try {

    vector<int> v;
    v.push_back(6);
    v.push_back(3);
    v.push_back(4);
    v.push_back(2);
    v.push_back(7);
    v.push_back(5);
    v.push_back(8);
    v.push_back(8);
    for( int i = 0; i < v.size(); i++ ) //output v
        cout << v[i] << " ";

    vector<int> sp1(spans1(v)); //My program crashes here
    vector<int> sp2(spans2(v)); //It crashes here also (if the previous line is                  
                                //commented out)

    for( int i = 0; i < sp1.size(); i++ ) //output sp1
        cout << "sp1: " << sp1[i] << " ";

    for( int i = 0; i < sp2.size(); i++ ) //output sp2
        cout << "sp2: " << sp2[i] << " ";

}
catch( int x ) {
    if( x = -1 )
        cout << "Access to empty stack";
}
}

2 个答案:

答案 0 :(得分:1)

您在代码中遇到各种问题。建议始终使用所有警告进行编译。

首先:Stack& Stack::operator=(const Stack& s)必须返回一个值,而修复方法是将行return *this;添加为方法的最后一行(这用于链接赋值示例{{ 1}}

第二:int a = b = c = 3;函数已声明并被调用但未实现。

第三个和真正的问题: spans1 中的行vector<int> spans2(vector<int>& x);声明了一个向量,当您在此之后将其编入索引vector<int> s;时是一个无效的访问内存,修复是通过s[i] = j;改变坏行,它初始化大小与x相同的向量和所有值为0的元素。

答案 1 :(得分:0)

您的分段错误很可能来自于越界写入。 在写入之前,您必须确保向量的大小合适。

vector<int> spans1(vector<int>& x) {

    int j = 0;
    vector<int> s; // < s is empty.

    for( int i = 0; i < x.size()-1; i++ ) {
        j = 1;
        while( j <= i && x[i-j] <= x[j] )
            j++;
        s[i] = j; // < You write to empty s here.
    }

    return s;
}

尝试将vector<int> s;更改为vector<int> s(x.empty() ? 0 : x.size()-1);

spans2有一个非常类似的问题。