KdTree C 实现导致核心转储
KdTree C implementation resulting in core dump
我正在处理无法找到解决方案的核心转储问题。任何形式的帮助将不胜感激,因为我变得绝望了。
我假设在第二次执行构建函数时出现错误,但我不知道有什么大惊小怪的。
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;
}
提前谢谢你。
您将变量 v
声明为指向 struct node
的指针,但您没有初始化此指针。未初始化的局部(非静态)变量具有 不确定 值。
使用未初始化的本地(非静态)变量会导致未定义的行为,这是导致崩溃的常见原因。
现代编译器擅长检测未初始化变量的使用,并发出警告。不过,您可能必须启用额外的警告,因此在使用例如gcc
添加标志 -Wall
并且您应该收到有关此的警告。
我正在处理无法找到解决方案的核心转储问题。任何形式的帮助将不胜感激,因为我变得绝望了。
我假设在第二次执行构建函数时出现错误,但我不知道有什么大惊小怪的。
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;
}
提前谢谢你。
您将变量 v
声明为指向 struct node
的指针,但您没有初始化此指针。未初始化的局部(非静态)变量具有 不确定 值。
使用未初始化的本地(非静态)变量会导致未定义的行为,这是导致崩溃的常见原因。
现代编译器擅长检测未初始化变量的使用,并发出警告。不过,您可能必须启用额外的警告,因此在使用例如gcc
添加标志 -Wall
并且您应该收到有关此的警告。