为什么第一段代码(中序遍历二叉树线索化)可以改变T中结构的值而第二段简单代码则不行

第一段主函数里定义 BiTree p,然后将p传入:InThreading(p),就能在函数里改变p->lchild等变量,而第二段代码也是相同的定义,却改变不了n中data的数值,想了很久没有想清楚,泪求点通

//第一段代码
typedef struct BitNode
{
    char data;                              //结点数据
    struct BitNode *lchild;                 //左右孩子指针
    struct BitNode *rchild; 
    PointerTag ltag;                        //左右标志
    PointerTag rtag;
}BitNode, *BiTree;
//中序遍历进行中序线索化
void InThreading(BiTree p)
{
    if(p)
    {
        InThreading(p->lchild);              //递归左子树线索化
        if(!p->lchild)                       //没有左孩子
        {
            p->ltag = Thread;                //前驱线索
            p->lchild = pre;             //左孩子指针指向前驱,这里是第3步
        }
        if(!pre->rchild)                 //没有右孩子
        {
            pre->rtag = Thread;              //后继线索
            pre->rchild = p;             //前驱右孩子指针指向后继(当前结点p)
        }
        pre = p;

        InThreading(p->rchild);              //递归右子树线索化
    }
}




//第二段代码

typedef struct{
    int data;
}*elemtype;

void f(elemtype n)
{
    n->data=1;
}

void main()
{
    elemtype n;
    f(n);
    printf("%d",n->data);
} 

看了好久,都觉得第二段代码要报错,自己试了下gcc编译后运行,是会Segmentation fault的
elemtype是一个指向struct的指针,你没有alloc内存,这应该是一个野指针了,n->data应该是不允许执行操作的