2014-02-13 17 views
0

我有以下用于练习序列表的C++代码,它通过了编译器。但是,当我尝试运行它时,它会返回Segmentation故障。请帮忙!!非常感谢。C++代码传递复制但返回分段错误

的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++; 
}; 
+3

您可以尝试调试程序。调试器应该停在segfault的地方。 –

回答

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所作的值。要更改类中的私有值,您应该使用构造函数或其他函数来初始化值。

+0

您好Candlemancer。感谢您的回复。然而,我不'认为我可以是0,导致在for循环条件,我> pos,其中pos是从0~3。 – Laodao

+0

这是真的,但在for循环下面的下一个语句是seq [i-1 ]。所以函数将开始,我将被声明,for循环将设置i = 0,然后检查是否0> pos。它不是,所以它跳过for循环,但是接下来的语句试图分配seq [-1] = str;这会导致问题。 – Candlemancer

+0

谢谢,谢谢!你是完全正确的。 – Laodao