未知分割故障

Unknown segmentation fault

本文关键字:故障 分割 未知      更新时间:2023-10-16

我有两个函数用来计算给定一组数字的跨度。

  • 张成空间的定义:给定一个向量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";
}
}

代码中有各种问题。建议编译时将所有警告设置为always。

第一:Stack& Stack::operator=(const Stack& s)必须返回一个值,不,修复是添加行return *this;作为方法的最后一行(这是用于链接赋值示例int a = b = c = 3;

)

第二:vector<int> spans2(vector<int>& x);函数被声明和调用,但没有实现。

第三和真正的问题:行vector<int> s;spans1是声明一个向量,当你索引这样的s[i] = j;以后,它是一个无效的访问内存,修复是改变坏行vector<int> s(x.size(), 0);初始化向量与x相同的大小和所有元素的值为0。

您的分段错误最有可能来自越界写入。在写入vector之前,必须确保vector的大小合适。

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也有类似的问题