结构数组的分段错误

时间:2013-10-07 01:32:03

标签: c arrays pointers

尝试计算一个点数组中最左边的点,程序在我身上爆炸(分段错误(核心转储)错误)。

这是界面:

//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 !!),我的问题是问题究竟在哪里,我该如何解决?

1 个答案:

答案 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的版本更有用;你需要知道数组中哪个条目是最左边的,而不仅仅是条目的值。

您还会注意到paxdiabloindex设置为零,以避免在数组中的第一项是最低{{{}}时返回“随机”值的可能性。 1}}值。


鉴于你已经解决了编译问题,下一个问题应该是:

  • 调用函数时x的值是多少?

您始终可以将打印代码添加到函数中,以检查您是否获得了正确的数据:

numPoints

或该主题的变体。