我一直在使用C++编写项目,通常我不会在分段错误方面遇到太多麻烦,但我是C++的新手。基本上,我做了一个指向IntList的指针,并调用prepend()从指针创建一个IntList。问题是prepend被调用时,它被卡在头文件的某处,justd退出。我不知道是什么导致了这一点,gdb告诉我它只是卡在头上。帮助将非常感激,就像提示或线索我做错了什么。谢谢。这是为什么导致分段错误?
IntList.h:
#ifndef _INTLIST_H
#define _INTLIST_H
#include <string>
#include <cstring>
using namespace std;
class EmptyIntList;
class IntList
{
public:
static IntList *emptyList();
//static IntList *fromString(string s);
virtual bool isEmpty();
IntList *prepend(int n);
virtual int head();
virtual IntList *tail();
string toString();
// virtual int length();
// virtual IntList *append(IntList *lst);
// virtual int operator[](int n);
// virtual ~IntList();
protected:
IntList();
IntList(IntList &);
// const IntList &operator=(const IntList &);
private:
int data;
IntList *rest;
};
IntList *operator+(IntList &lst1, IntList &lst2);
ostream &operator<<(ostream &outStream, IntList *lst);
ostream &operator<<(ostream &outStream, IntList &lst);
#endif
IntList.cpp:
#include "IntList.h"
#include "EmptyIntList.h"
#include <sstream>
IntList::IntList(){}
IntList *IntList::emptyList(){
return ((IntList*)EmptyIntList::emptyList());
}
bool IntList::isEmpty(){
return false;
}
IntList *IntList::prepend(int n){
IntList *x;
IntList y;
*x = y;
y.data = n ;
y.rest = x ;
return x;
}
int IntList::head(){
return data;
}
IntList *IntList::tail(){
return rest;
}
testIntList.cpp:
int main()
{
int n;
IntList *x;
n=6;
x->prepend(n);
// cout << x->toString();
return 0;
}
GDB步步:
8 int main()
(gdb) step
12 n=6;
(gdb)
14 x->prepend(n);
(gdb)
IntList::prepend (this=0x0, n=6) at IntList.cpp:30
30 IntList y;
(gdb)
IntList (this=0x7fff93ecb3c0) at IntList.cpp:12
12 IntList::IntList(){}
(gdb)
IntList::prepend (this=0x0, n=6) at IntList.cpp:32
32 *x = y;
(gdb)
IntList::operator= (this=0x401650) at IntList.h:18
18 {
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0x0000000000401361 in IntList::operator= (this=0x401650) at IntList.h:18
18 {
你说你是C++新手?我会推荐[一本很好的C++入门书](http://stackoverflow.com/q/388242/46642)。是的,我对每个新手都说:) –