C 中的快速联合实现中的分段错误(核心转储)


#include<stdio.h>
#include<stdlib.h>
int *id,N;
main()
{
    FILE* file=fopen("a.txt","r");
    int i,p,q,c;
    fscanf(file,"%d",&N);
    id=(int *)malloc(N*sizeof(int));
    for(i=0;i<N;i++)
        *(id+i)=i;
    while(!feof(file))
    {
        fscanf(file,"%d %d",&p,&q);
        if(!connected(p,q))
            unn(p,q);
    }
    fclose(file);
    c=1;
    while(c==1)
    {
        scanf("%d %d",&p,&q);
        printf("%dnYes(1) or No(0)    ",connected(p,q));
        scanf("%d",&c);
    }
}
connected(int p,int q)
{
    return((root(p))==(root(q)));
}
unn(int p,int q)
{
    int j=root(q);
    int i=root(p);
    *(id+j)=i;
}
root(int i)
{
    while(i!=(*(id+i)))
        i=*(id+i);
    return(i);
}

编译时,不显示任何错误消息。但是,当我尝试执行此程序时,它说"分段错误(核心转储)。为什么会这样?可能已经注意到,这是实现快速联合的尝试。

使用相同的文件"a.txt"轻松实现快速查找,只需对此代码进行一些调整。* "是"或"否"用于用户的查询。

我想这就是问题所在

root(int i)
{
    int p;  
    while(p!=(*(id+p)))   <-- p uninitialised 
        p=*(id+p);
    return(p);
}

因为p未初始化,但您将其用作指针取消引用中的偏移量。即使这不是原因,它仍然是一个大问题。

此后,您编辑了问题以离开

root(int i)
{
    int i;  
    while(i!=(*(id+i)))  
        i=*(id+i);
    return(i);
}

在其中,在本地重新声明一个i变量以及一个作为函数参数传递的i变量。

相关内容

  • 没有找到相关文章

最新更新