【问题标题】:Segmentation error but I don't know why分段错误,但我不知道为什么
【发布时间】:2013-12-10 22:32:55
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_SIZE 100

我正在尝试根据与原点的距离对二维点数组进行快速排序,但我的代码在第一个 scanf 之后命中了 Seg fault。

typedef struct point{
double x;
double y;
double dist;
    } point;

void sortpoints(point arr[], int low, int high);
void printpoints(point arr[], int n);

排序点只是一个快速排序的操作,它根据Point.dist 的值对Point structs 的数组进行排序

void sortpoints(point arr[], int low, int high){
    int piv, i, j;
    piv = low;
    i = low;
    j = high;
    point box;
    if(low < high){
        while(i<j){
            while((arr[i].dist)<=(arr[piv].dist) && i<= high)
                i++;
            }
            while((arr[j].dist) > (arr[piv].dist) && j>= low)
                j--;
            }
            if(i<j){
                box = arr[i];
                arr[i] = arr[j];
                arr[j] = box;
            }
        box = arr[j];
        arr[j] = arr[piv];
        arr[piv] = box;
        sortpoints(arr, low, j-1);
        sortpoints(arr, j+1, high);

    }

Printpoints 只是按照与原点的距离顺序打印点

    void printpoints(point arr[], int n){
        int i; for(i = 0; i <= n; i++){
                    printf("(%.2lf, %.2lf)\n", arr[i].x, arr[i].y);
                }
    }

用户在表格(point.x,point.y)中输入点数和点值

int main(){

    point pointa;
    point pointarray[MAX_SIZE];
    int n=0;
    printf("how many points would you like to enter?\n");
    scanf("%d", &n);
    if(n<MAX_SIZE){
        int i;
        for(i=0; i<n ; i++){
            scanf("(%lf,%lf)", &pointa.x, &pointa.y);
            pointa.dist = sqrt(pointa.x*pointa.x + pointa.y*pointa.y);
            pointarray[i] = pointa;
        }
        sortpoints(pointarray, 0, n-1);
        printpoints(pointarray, n);}
    else{
        printf("sorry, not a valid array size\n");
    }



    return 0;
}

【问题讨论】:

  • 我已经有一段时间没有重新通过 C 中的运算符优先级了...你可以试试 &amp;(pointa.x) 吗?
  • 您好,谢谢您的回复!刚刚尝试过,不幸的是没有运气。
  • @SJuan76 元素选择运算符. 的优先级高于&amp; 的地址,并首先运行。

标签: c arrays void


【解决方案1】:

我有堆栈溢出。

你的程序调用函数sortpoints,也调用它自己(sortpoints调用sortpoints)。但我看不出sortpoints 必须停在哪里!

因此,j-1 变为 null,arr[j] 根本无效。

【讨论】:

    【解决方案2】:

    当我改变这一行时:

    scanf("(%lf,%lf)", &pointa.x, &pointa.y);
    

    到这里:

    scanf("%lf,%lf", &pointa.x, &pointa.y);
    

    实际上是在读入点值,使用括号没有读入任何内容,但我在scanf 的文档中没有看到任何关于此的内容,有人熟悉吗?

    您的排序代码似乎进入了无限递归并导致堆栈溢出。

    【讨论】:

      【解决方案3】:

      您的问题在于您的牙套。我已经稍微重新格式化了您的排序点功能,以便更清楚每个基本块的实际位置。

      void sortpoints(point arr[], int low, int high){
          int piv, i, j;
          piv = low;
          i = low;
          j = high;
          point box;
      
          if(low < high){
              while(i<j){
                  while((arr[i].dist)<=(arr[piv].dist) && i<= high)
                      i++;
              }
      
              while((arr[j].dist) > (arr[piv].dist) && j>= low)
                      j--;
          }
      
          if(i<j){
              box = arr[i];
              arr[i] = arr[j];
              arr[j] = box;
          }
      
          box = arr[j];
          arr[j] = arr[piv];
          arr[piv] = box;
          sortpoints(arr, low, j-1);
          sortpoints(arr, j+1, high);
      }
      

      现在应该很明显,您的段错误是意外无限递归的结果。这是对循环使用{ } 的一个很好的论据,即使使用单个语句也是如此。

      【讨论】:

        猜你喜欢
        • 2018-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多