未知分割故障
Unknown 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";
}
}
代码中有各种问题。建议编译时将所有警告设置为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
也有类似的问题
相关文章:
- 分割故障C++矩阵
- C ,二进制树的高度,而不是检查我的子树是否为空,而是在检查我的子树是否是叶子节点.抛出分割故障
- 我正在为此代码分割故障
- 在执行strcpy时获取分割故障错误
- 空隙指针分割故障
- Xcode会产生分割故障,而不是例外
- OPENCV C 中的分割故障误差
- 分割故障:核心倾倒C 矢量对字符串:
- C 2D数组导致分割故障(核心倾倒)
- 分割故障/错误读数变量-C 列表
- DLSYM导致分割故障
- 使用C 中的操作员删除的分割故障
- 使用Linux X64下的Libmozjs-52(SpidermonKey)进行分割故障
- 使用长变量时分割故障(11)错误
- C - 返回字符串时的分割故障
- 创建VertexArray时的分割故障
- 向量分割故障的向量
- 从std :: fileSystem ::路径对象的类中退出时的分割故障
- C 矢量分割故障
- 基于向量的数据格式的分割故障误差