KdTree C实现导致核心转储

时间:2015-06-02 09:12:50

标签: c coredump kdtree

我正在处理一个我无法找到解决方案的核心转储问题。任何形式的帮助都会受到赞赏,因为我变得无望。

我认为在进行建筑功能的第二次执行时会出现错误,但我对此无关紧要。

http://pastebin.com/XwW33VY8

struct node *BuildKdTree(struct point *S, int d, int n)
{
    struct node *v;

    if(n==1)
    {
        v->l.x=S[0].x;
        v->l.y=S[0].y;
    }
    else
    {
        int i, n1, n2;
        float mE, mV;
        struct point *S1, *S2;

        S1=(struct point*)malloc(sizeof(struct point)*(n));
        S2=(struct point*)malloc(sizeof(struct point)*(n));

        if(d%2 == 0)
        {
            bubbleSortX(S, n);
            mV=medianValueX(S, n);
            v->l.x=mV;
            mE=medianElement(n);

            for(n1=0;n1<(int)mE;n1++)
            {
                S1[n1]=S[n1];
            }

            for(n2=0, i=(int)mE;i<n;n2++, i++)
            {
                S2[n2]=S[i];
            }
        }
        else
        {
            bubbleSortY(S, n);
            mV=medianValueY(S, n);
            v->l.y=mV;
            mE=medianElement(n);

            for(n1=0;n1<(int)mE;n1++)
            {
                S1[n1]=S[n1];
            }

            for(n2=0, i=(int)mE;i<n;n2++, i++)
            {
                S2[n2]=S[i];
            }
        }

        v->leftChild=BuildKdTree(S1, d+1, n1);
        v->rightChild=BuildKdTree(S2, d+1, n2); 
    }

    return v;
}

提前谢谢。

1 个答案:

答案 0 :(得分:0)

您将变量v声明为指向struct node的指针,但不要初始化此指针。未初始化的本地(非静态)变量具有 indeterminate 值。

使用未初始化的本地(非静态)变量会导致未定义的行为,这是崩溃的常见原因。

现代编译器善于检测未初始化变量的使用,并警告它们。您可能必须启用额外警告,因此在使用例如gcc添加标记-Wall,您应该收到警告。