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;
}
- c语言中关于“访问冲突”的问题
- C语言中关于IF的问题..
- c语言中关于二维数组的指针访问
- c语言中关于一维数组的指针访问
- c语言中的指针传递引起的访问冲突
- C语言中关于.h和.c的问题
- C语言命名冲突问题
- 关于linux中c语言的编译问题的总结
- 关于C语言的问题
- 关于c语言的问题
- C语言关于++--的问题
- 关于C语言的问题
- 关于c语言中容易忽略的问题
- 关于C语言中printf函数的一个问题
- C语言:关于计算字符串中空格数的问题
- 关于C语言,字符数组中越界的两个问题
- C语言中关于字符串左右循环移位的问题
- 关于C语言中数据结构的内存对齐问题
- svn冲突解决
- 解决ASP.NET上传文件大小限制
- Visual C++的安装问题?以及Visual C++正确安装但是Visual assist安装后不能使用的问题
- 使用thickbox问题集合及解决方案
- 监视函数是否被设置 INT3 断点
- c语言中关于“访问冲突”的问题
- 团购主页未来所需突破的瓶颈
- json与eval
- mysql ERROR 1045(完全删除mysql包括密码:apt-get autoremove --purge mysql-server-5.0)
- VIEW32 使用
- 搜狗浏览器的高速模式果然很流畅
- UNIX技术内幕学习笔记(持续更新中)
- PDF加密文件解密方法(解除复制打印限制)——转帖
- 夕阳下的歌声