C语言链栈,栈顶元素返回问题

求求各位大佬了,为什么a返回的是地址啊!

#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef int ElemType;
#define TRUE 1;
#define ERROR 0;
typedef struct Node
{
	ElemType data;
	struct Node* next;
}StackNode,*StackList;
Status InitStack(StackList S);    //初始化(无头结点)
Status Push(StackList S, ElemType e);  //头插法
Status Pop(StackList S, ElemType* a);   //弹出
int main()
{
	int n;
	ElemType e, a;
	StackList S;
	S = (StackList)malloc(sizeof(StackNode));
	if (InitStack(S) == 1)
	{
		printf("恭喜!构建空链栈成功!\n");
	}
	printf("请输入插入元素个数:");
	scanf("%d", &n);
	printf("请输入插入栈的元素:");
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &e);
		Push(S, e);
	}
		printf("恭喜你!插入成功!\n");  
	if (Pop(S, &a) == 1)
	{
		printf("恭喜你!出栈成功!\n");
		printf("删除栈顶元素:%d\n", a);
	}

	return 0;
}
Status InitStack(StackList S)
{
	S = NULL;

	return TRUE;
}
Status Push(StackList S, ElemType e)
{
	StackList P;
	P = (StackList)malloc(sizeof(StackNode));
	P->data = e;
	P->next = S->next;
	S = P; //修改栈定指针

	return TRUE;
}
Status Pop(StackList S, ElemType *a)
{
	StackList P;
	P = S;
	if (P == NULL)
		return ERROR;
	*a = S->data;
	S = S->next;
	free(P);
	
	return TRUE;
}

 

Push阶段有问题,这个相当于链表中的头插法,我在你的基础上改了一下,你注意单步调试

Status Push(StackList S, ElemType e)
{
	StackList P;
	P = (StackList)malloc(sizeof(StackNode));
	P->data = e;
	P->next = S->next;
	S->next = P; //修改栈定指针
	return TRUE;
}

 

Pop阶段相当链表中删除第一个结点,这是我在你基础上改的

 

Status Pop(StackList S, ElemType* a)
{
	StackList P;
	P = S->next;
	if (S == NULL)
		return ERROR;
	S->next = P->next;
	*a = P->data;
	free(P);
	return TRUE;
}

 

这是运行的截图

 

PUSH阶段中a的值出错了,你的S = P那里不知道为什么没有成功,S = P之后,S->data的值很奇怪,我再看看 

坐等大佬解决,我太菜了。。。现在已知在PUSH阶段输出没问题,PUSH一过就出问题了