念写一个栈头文件,不知道为何在测试程序出现系统崩溃,实现不了

想写一个栈头文件,不知道为何在测试程序出现系统崩溃,实现不了。
Stack.h
#ifndef Stack_H 
#define Stack_H 

typedef int Item;
typedef struct node *PNode;

/*定义结点类型*/

typedef struct node
{
   Item data;
   PNode Last; /*指向上个结点*/
   PNode Next; /*指向下个结点*/
}Node;

/*定义栈类型*/

typedef struct stack
{
   PNode top;  /*栈顶*/
   int size; /*栈的大小*/
}Stack;

Stack *InitStack();        /*建立一个空栈*/

void DestroyStack(Stack *ps);   /*销毁一个栈*/

void ClearStack(Stack *ps);   /*清空一个栈*/

int IsEmpty(Stack *ps);      /*判断栈是否为空*/

Item GetTop(Stack *ps,Item *pitem); /*得到栈顶元素,并赋给pitem*/

Stack Push(Stack *ps,Item item); /*使元素入栈*/

Stack Pop(Stack *ps,Item *pitem); /*删除栈顶,栈顶元素给pitem*/

#endif




Stack.c

#include"Stack.h"
#include<malloc.h>
#include<stdlib.h>

Stack *InitStack()
{
    Stack *ps;
    ps=(Stack *)malloc(sizeof(Stack)); /*开辟一个Stack大小的空间,想问这个stack大小的空间是不是包括PNode结构体大小的空间加上一个int空间*/
    if(ps != NULL){                    /*如果开辟空间成功*/
        ps->top->date = 0;
        ps->top->Next = NULL;
        ps->top->Last = NULL;
        size = 0;
        return ps;
   }
   else
        exit(1);
}

void DestoryStack(Stack *ps)
{
     if(IsEmpty(ps) != 1)
        ClearStack(ps);
     free(ps);
}

void ClearStack(Stack *ps)
{
         while(IsEmpty(ps) != 1)
        Pop(ps,NULL);
}

int IsEmpty(Stack *ps)
{
     if(ps->size == 0)
         return 1;
     else
         return 0;
}

PNode GetTop(Stack *ps,Item *pitem)
{

     if(IsEmpty(ps) != 1 && pitem != NULL)

         *pitem=ps->top->Item;

     return ps->top;
}

PNode Push(Stack *ps,Item item)
{
    PNode pnode;
    
    
       pnode = (PNode)malloc(sizeof(Node));  /*否则开辟一个新的结点*/
       pnode->Item = item;  /*把元素赋给pnode*/
       ps->top->Next = pnode; /*使栈顶指向新结点*/
       pnode->Last=ps->top; /*使新结点的指向栈顶*/