c语言中关于“访问冲突”的问题

来源:互联网 发布:阿里云备案客服电话400 编辑:程序博客网 时间:2024/06/06 07:16

       最近的两次数据结构实验,在调试过程中都出现了如“0xC0000005:写入位置0x00000000 时发生访问冲突”类似的问题,所以想归纳一下出现这种问题的可能原因,便于以后程序的调试。

        一般出现这种访问冲突的问题最常见的可能原因就是数组越界、未正确初始化指针(导致出现空指针、野指针等)以及堆栈出现问题,所以,当出现这种问题时首先应检查指针等是否正确初始化、是否越界。

        在我数据结构二叉树的实验中,访问冲突的问题就出在指针上。

        对于二叉树的先序递归构造:
先看如下代码:
void  CreateBiTree(BiTNode *T)
{
 char ch;
 scanf("%c",&ch);getchar();
 if(ch=='*')
  T=NULL;
 else{
  if(i==0);
  else{
   T=(BiTree)malloc(sizeof(BiTNode));
  }
  if(!T){
   printf("OVERFLOW!/n");
   exit(-1);
  }   
  T->data=ch;
  i++;
  CreateBiTree(T->lchild);
  CreateBiTree(T->rchild);
 }
}

这会引起“访问冲突”
错误原因如下:
1.传进去的T在main函数中已经分配了空间(BiTNode T),不应该在这个函数中重新分配。
2.对于T中的三个成员(data,lchild,rchild),在T分配了空间之后T->lchild,T->rchild都已经赋值。CreateBiTree(T->lchild)传进去的是已经赋值的T->lchild,里面存放的是一块内存的地址,因为传进去的是T->lchild的值,而不是T->lchild的地址,所以create函数不能对T->lchild的值进行修改。举个简单的例子就是:
void h(int x){
    x=0;
}
void main(void){
    int x=1;
    h(x);
    printf("%d",x);
    getchar();
}
输出结果是1 而不是0


所以算法应该改为:
BiTree CreateBiTree(void)
{
 BiTNode *T;
 char ch;
 scanf("%c",&ch);getchar();
 if(ch=='*')
  T=NULL;
 else{
  T=(BiTree)malloc(sizeof(BiTNode)); 
  T->lchild = NULL;
  T->rchild = NULL;
  if(!T){
   printf("OVERFLOW!/n");
   exit(-1);
  }
  T->data=ch;
  T->lchild=CreateBiTree();
  T->rchild=CreateBiTree();
 }
 return T;
}