Pointers ANSI-C中的随机树程序-什么生成SIGSEGV?

Pointers ANSI-C中的随机树程序-什么生成SIGSEGV?,pointers,data-structures,ansi-c,Pointers,Data Structures,Ansi C,在main.c中,树被声明并启动,但过程: void MakeTree(Tree T, int n) { int i, r; Node *x, *p; time_t t; srand((unsigned) time(&t)); for(i = 0; i < n; i++) { Node * new = malloc(sizeof(Node)); new->key = rand() % 100;

在main.c中,树被声明并启动,但过程:

void MakeTree(Tree T, int n)
{
    int i, r;
    Node *x, *p;
    time_t t;
    srand((unsigned) time(&t));

    for(i = 0; i < n; i++)
    {
        Node * new = malloc(sizeof(Node));
        new->key = rand() % 100;
        x = T.root;
        NodeInit(p);
        while(x != NULL)
        {
            p = x;
            r = rand() % 2;
            if(r == 0) x = p->left;
            else x = p->right;
        }
        new->parent = p;

        if (T.root == NULL) 
            T.root = new;
        else
            if (r == 0)
            {
                p->left = new;
            }
            else 
            {
                p->right = new;
            }
    }
}
void生成树(树T,int n)
{
int i,r;
节点*x,*p;
时间;
srand((未签名)时间(&t));
对于(i=0;i键=rand()%100;
x=T.根;
NodeInit(p);
while(x!=NULL)
{
p=x;
r=rand()%2;
如果(r==0)x=p->left;
否则x=p->right;
}
新建->父级=p;
if(T.root==NULL)
T.根=新的;
其他的
如果(r==0)
{
p->左=新;
}
其他的
{
p->right=新建;
}
}
}
在以下行的WHILE循环中生成内存冲突错误:

否则x=p->right


<>我在这项工作中错过了什么?

使用<代码>新< /C>作为一个变量名称对我们可怜的C++程序员来说是一件微不足道的事情。@ Bathsheba,但它是ANSI C,所以他很好地在他的权限之内,这不是一件不寻常的事情。在你的最终的<代码>()(<)>代码>语句中有一个明显的错误,但是我敦促你自己去发现它。我还敦促您在调试器中单步执行程序,自己查找问题。此外,如果您总是在属于
if
语句等的块周围放置
{}
和相应的换行符,您将为自己节省很多麻烦。@slim-aww,我看到了它-编辑。我在发布之前使用了调试器,发现这个部分生成SIGSEGV:x=p->left;(或x=p->右侧;由于r随机变量)。我不明白这个指针怎么了。