二叉树建立链式存储,实在找不出哪里的问题?

下面是代码,哪里出的问题。用的dev c++输入完字符直接奔溃,好像是pbi->的内存都不能访问,也遍历不了。为什么会这样?
自己瞎学了两三个月编程,实在没人可问。建立函数改成返回pbi也不行。函数哪里的空间被释放了?

# include <stdio.h>
# include <malloc.h>
//创建二叉树,先序:ABC##DE#G##F###
typedef struct BiNode
{
    char data;
    struct BiNode * lchild;
    struct BiNode * rchild;
}BINODE, * PBINODE;

void initbinode(PBINODE);//建立二叉树
void traverse_bi(PBINODE);//遍历二叉树
int main()
{
    PBINODE pbi = NULL;
    
    printf("先序输入二叉树结点数据:\n");
    initbinode(pbi);
    printf("%c\n",pbi->data);//这里访问不了pbi->data!
    traverse_bi(pbi);
    return 0;
}
void initbinode(PBINODE pbi)//先序建立二叉树 “ABC##DE#G##F###”
{ 
    char ch;
    scanf("%c",ch);
    if ('#' == ch)
    {
        pbi = NULL;    
    } 
    else
    {
        pbi = (PBINODE)malloc(sizeof(BINODE));
        pbi->data = ch;
        pbi->lchild = NULL;
        pbi->rchild = NULL;
        printf("%c\n",pbi->data);
        initbinode(pbi->lchild);
        initbinode(pbi->rchild);    
    }
    

}
void traverse_bi(PBINODE pbi)
{
    if(NULL != pbi)
    {
        printf("%c\n",pbi->data);
        if (pbi->lchild != NULL)
        {
            traverse_bi(pbi->lchild);
        }
        if (pbi->rchild != NULL)
        {
            traverse_bi(pbi->rchild);
        }
        
    }
    
}




首先void initbinode(PBINODE &pbi)

是要传入二级指针吗?改完试了编译可以,但是运行输入完字符又奔溃了