c语⾔中关于“访问冲突”的问题
最近的两次数据结构实验,在调试过程中都出现了如“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);
}
}
c语言指针实验总结这会引起“访问冲突”
错误原因如下:
1.传进去的T在main函数中已经分配了空间(BiTNode T),不应该在这个函数中重新分配。
2.对于T中的三个成员(data,lchild,rchild),在T分配了空间之后T->lchild,T->rchild都已经赋值。Creat
eBiTree(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;
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论