I've been coding this in project in C++, normally I wouldn't have too much trouble with a segmentation fault, but I'm new to C++. Basically I'm making a pointer to an IntList and calling prepend() to make a IntList from the pointer. The problem is when prepend is called it is getting stuck somewhere in the header file an justd exits out. I can't tell what is causing this and gdb tells me it just gets stuck at the header. Help would be really appreciated, like a hint or clue to what I'm doing wrong. Thank you.
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 step by step:
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  {
 
     
     
     
    