我有以下用于练习序列表的C ++代码,它通过了编译器。但是,当我尝试运行它时,它会返回Segmentation fault。请帮忙!!非常感谢。
的main.cpp
#include <iostream>
#include <string>
#include "SeqList.h"
using namespace std;
int main() {
SeqList seq;
string vv[] = {"a", "b", "c", "d"};
for (int i = 0; i< 4; i++) {
seq.addElement(vv[i], i);
}
string* v = seq.getSeq();
for (int i=0; i<seq.getSeqSize(); i++) {
cout << v[i] <<endl;
}
return 0;
}
SeqList.h
#include<iostream>
#include<string>
using namespace std;
class SeqList {
private:
string seq[];
int size;
public:
void addElement(string, int);
void delElement(string, int);
string* getSeq();
int getSeqSize();
};
SeqList.cpp
#include <iostream>
#include <string>
#include "SeqList.h"
using namespace std;
string seq[100];
int size = 0;
string* SeqList::getSeq(){
return seq;
};
int SeqList::getSeqSize(){
return size;
};
void SeqList::addElement(string str, int pos) {
int i;
for (i = size; i > pos; i--) {
seq[i] = seq[i-1];
}
seq[i-1] = str;
size++;
};
答案 0 :(得分:2)
您的段错误正在发生,因为您在seq[i-1]
时尝试访问addElement中的i = 0
。这会尝试访问seq
之外的内存,这会导致段错误。尝试使用seq[i]
和seq[i+1]
代替seq[i-1]
和seq[i]
,但您必须确保永远不会调用超过99个值的代码,否则您将运行进入类似的问题,程序试图在seq
结束后访问内存。
另外,在SeqList.cpp
中string seq[100];
int size = 0;
当您尝试更改在SeqList.h中创建的值时,这些行正在创建新变量。要更改类中的私有值,您应该使用构造函数或其他函数来初始化值。