尝试计算一个点数组中最左边的点,程序在我身上爆炸(分段错误(核心转储)错误)。
这是界面:
//points.h
#define MAX_POINTS 100
struct Point {
char label;
int x;
int y;
};
int leftmostPoint(struct Point points[], int numPoints);
以下是leftmostPoint
实施:
//points.c
//get the point with the smallest x value
int leftmostPoint(struct Point points[], int numPoints) {
int smallestX = points[0].x; //assume first point is smallest
int index;
for (int i = 1; i < numPoints; i++) {
if (points[i].x < smallestX) {
smallestX = points[i].x;
index = i;
}
}
return points[index];
}
这就是魔术发生的地方:
//magic.c
struct Point points[MAX_POINTS];
//build array via standard input (this works, tested by printing the points)
//only 5 points were added in
displayPoint(points[0]); //works
displayPoint(points[4]); //works
struct Point hull;
hull = leftmostPoint(points, numPoints); //this is where the program blows up
我很确定这是一个发送指针的问题而不是数组的实际副本(诅咒c !!),我的问题是问题究竟在哪里,我该如何解决?
答案 0 :(得分:4)
在原始版本的代码中,您的函数leftmostPoint()
应该返回int
,但您返回struct Point
。编译器应该抱怨这个。 (代码已更新为返回struct Point
。)
调用:
struct Point hull = leftmostPoint(points, numPoints);
表示问题出在leftmostPoint()
声明中,该声明应返回struct Point
而不是int
。
所以,通过以下方式解决:
struct Point (leftmostPoint(struct Point points[], int numPoints)
{
int smallestX = points[0].x; //take the first point in the list and assume it's smallest
int index = 0;
for (int i= 1; i < numPoints; i++){
if (points[i].x < smallestX){
smallestX = points[i].x;
index = i;
}
}
return points[index];
}
或者通过:
int leftmostPoint(struct Point points[], int numPoints)
{
int smallestX = points[0].x; //take the first point in the list and assume its smallest
int index = 0;
for (int i= 1; i < numPoints; i++){
if (points[i].x < smallestX){
smallestX = points[i].x;
index = i;
}
}
return index;
}
我怀疑返回int
的版本更有用;你需要知道数组中哪个条目是最左边的,而不仅仅是条目的值。
您还会注意到paxdiablo将index
设置为零,以避免在数组中的第一项是最低{{{}}时返回“随机”值的可能性。 1}}值。
鉴于你已经解决了编译问题,下一个问题应该是:
x
的值是多少?您始终可以将打印代码添加到函数中,以检查您是否获得了正确的数据:
numPoints
或该主题的变体。