Unhandled exception in 027.exe:0xC0000005:Access Violation.知道是指针的有关问题,但是就是不懂如何解决…

Unhandled exception in 027.exe:0xC0000005:Access Violation.知道是指针的问题,但是就是不懂怎么解决……
#include<stdio.h>
#include<stdlib.h>

int father; //用于记录父节点的权值

//中间节点
struct BtNode
{

struct BtNode *left,*right;

int weight;
};

//
struct BtHead
{

struct BtNode * node;

int weight;
} *H;

void Insert(struct BtNode* T,int data)               
{

if(T==NULL)

{

T=(struct BtNode*)malloc(sizeof(struct BtNode));               //不知道这里空间为什么没有申请成功

T->weight=data;

T->left=NULL;

T->right=NULL;

}

else

{

father=T->weight;

if(data<T->weight)

Insert(T->left,data);

else

Insert(T->right,data);

}
}

int main(void)
{

int Node_num;

int data;

int i;


//首先创建一个排序树的头结点,其值为-1

H=(struct BtHead*)malloc(sizeof(struct BtHead));

H->weight=-1;

H->node=NULL;


scanf("%d",&Node_num);

for(i=0;i<Node_num;i++)

{

scanf("%d",&data);

fflush(stdin);

father=-1;  //让父节点指针首先指向头节点

Insert(H->node,data);                        //每一次循环,H->node都是NULL,难道空间没有申请成功

printf("%d\n",father);                                             //     为什么每一次输出总是-1

}

return 0;
}

Unhandled exception in 027.exe:0xC0000005:Access Violation.知道是指针的有关问题,但是就是不懂如何解决…
------解决方案--------------------

#include<stdio.h>
#include<stdlib.h>

int father; //用于记录父节点的权值

//中间节点
struct BtNode
{
struct BtNode *left,*right;
int weight;
}*H;

//
/*struct BtHead
{
struct BtNode * node;
int weight;
} *H;*/

void Insert(struct BtNode* T,int data)               
{

if(T==NULL)

{
T=(struct BtNode*)malloc(sizeof(struct BtNode));               //不知道这里空间为什么没有申请成功
T->weight=data;
T->left=NULL;
T->right=NULL;
father=T->weight;
}

else

{
if(data<T->weight)
Insert(T->left,data);
else
Insert(T->right,data);
}
}

int main(void)
{
int Node_num;
int data;
int i;

//首先创建一个排序树的头结点,其值为-1
H=(struct BtNode*)malloc(sizeof(struct BtNode));
H->left=NULL;
H->right=NULL;
H->weight=-1;

scanf("%d",&Node_num);
for(i=0;i<Node_num;i++)

{
scanf("%d",&data);
fflush(stdin);
father=-1;  //让父节点指针首先指向头节点
Insert(H,data);//每一次循环,H->node都是NULL,难道空间没有申请成功
printf("%d\n",father);                                             //     为什么每一次输出总是-1
}
return 0;
}

不知道是不是这个效果
------解决方案--------------------
因为参数类型传错了,你应该传地址的地址,而不能只传地址。
简单来说你在子函数中做了一个赋值T = malloc....为其分配了一段内存。但是T是形参,所以对形参的赋值是没有办法影响到实参的。所以调用以后你会发现实参仍然是空的。
记住,用地址做参数,主函数能够得到更改效果的是地址所在的内容而不是地址本身。所以你在子函数中修改地址中的内容,这个效果可以在主函数中得到体现;但是如果你在子函数中修改的是地址本身,这个效果在主函数中是看不到的。
------解决方案--------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。