繁体   English   中英

分段错误,但我不知道为什么

[英]Segmentation error but I don't know why

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_SIZE 100

我试图根据它们与原点的距离快速输入一组2D点,但是我的代码在第一次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);

    }

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

    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;
}

当我更改此行时:

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

对此:

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

实际上正在读取点值,其中没有任何内容被读入,我在scanf的文档中没有看到任何关于此的内容,但有人熟悉这个吗?

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

我有堆栈溢出。

您的程序调用函数sortpoints ,并自行调用( sortpoints调用sortpoints )。 但我无法看到sortpoints必须停止的地方!

结果, j-1变为null,而arr[j]根本无效。

你的问题是你的大括号。 我已经稍微重新格式化了您的分类点功能,因此每个基本块实际上更清晰。

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);
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM