为什么这段代码会给我带来细分错误?

时间:2019-02-07 05:06:08

标签: c

我是C语言的新手,试图让用户输入的数组升序打印。我正在尝试使用选择排序。我的devcpp在接受第一个输入后崩溃,当我尝试在在线c编译器上运行它时,它给出了分段错误。有人可以告诉我为什么会在这里发生吗? TIA

#include<stdio.h>

void swap()
{
    int *x, *y;
    int temp = *x;
    *x = *y;
    *y = temp;
}

void ss(int A[], int n)
{
    int i, j, min;
    for(i=0; i<n-1;i++)
    {
        min = i;
        for(j=i+1; j<n; j++)
        {
            if (A[j]< A[min])
            {
                min = j;
            }
            swap(&A[min], &A[i]);
        }
    }
}

void print(int A[], int n)
{
    int i;
    for(i=0; i<n; i++)
    {
        printf("%d",A[i]);
    }
}

int main()
{
    int A[4], i, n;
    printf("Enter the elements");
    scanf("%d", &A[i]);
    n=4;
    ss(A,n);    
    printf("Sorted array \n");
    print(A,n);
    return 0;

}

我希望用户按升序输入数组。

3 个答案:

答案 0 :(得分:1)

您的swap()函数没有参数,并且指针xy没有指向。您的细分错误来自以下语句:

int temp = *x;

由于*x没有确定的值,因此您没有为x分配程序中任何现有值的地址,而是尝试在此处间接使用它。

相反,将参数放在交换函数中:

void swap(int* x, int* y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

然后在外部范围中,将堆栈地址上的适当的现有值传递给此swap函数。

答案 1 :(得分:1)

嗯,这是一个错误的开始:

void swap()
{
    int *x, *y;
    int temp = *x;
    *x = *y;
    *y = temp;
}

这会在函数内创建两个带有任意值的全新 new 指针,然后尝试取消引用它们,这是行为未定义的问题。

由于要使用swap传递两个指向swap(&A[min], &A[i])函数的指针,因此您应该接收参数列表中的那些指针,以便可以对其进行操作:

void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

而且,尽管这不是错误,但您可能想要考虑使用比Ass(例如dataArray和{{ 1}})。

例如,如果您不得不在将来的十二个月内回来并对其进行修改,这将使您的代码更具可读性,因此可以维护。


您还需要在SelectionSort函数中使用 loop 来获取四个值。目前,您只能获得一个索引,索引号为main,这可能会导致您再次出现未定义的行为。

由于您已经在 other 两个函数中完成了类似的循环,因此我假设您可以在不提供代码的情况下完成此任务。

答案 2 :(得分:1)

伙伴有很多错误。我在下面列出了它们:

  • main()中,检查您如何接受用户的数组值。 i是未定义的,您试图插入到A[i]中而不使用for循环或未定义i。那就是您获得seg fault的地方。

    for(i = 0; i < 4; i++) scanf("%d", &A[i]);

  • 另一个错误是您定义swap()函数的方式。由于您已将swap函数称为swap(&A[min], &A[j]);,即将地址作为参数传递,因此您的函数也需要具有指向这些地址的指针。 应该是这样的:void swap(int* x, int* y)

  • 由于我们在上面第二点所做的更改,您需要删除此行==> int *x, *y;,该行再次在swap函数中声明2个指针。

这是应该起作用的代码:

#include<stdio.h>

void swap(int* x, int* y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

void ss(int A[], int n)
{
    int i, j, min;
    for(i=0; i<n-1;i++)
    {
        min = i;
        for(j=i+1; j<n; j++)
        {
            if (A[j]< A[min])
            {
                min = j;
            }
            swap(&A[min], &A[j]);
        }
    }
}

void print(int A[], int n)
{
    int i;
    for(i=0; i<n; i++)
    {
        printf("%d\t",A[i]);
    }
}

int main()
{
    int A[4], i, n;
    printf("Enter the elements:\n");
    for(i = 0; i < 4; i++)
      scanf("%d", &A[i]);
    n=4;
    ss(A,n);    
    printf("Sorted array \n");
    print(A,n);
    return 0;
}

输出如下:

  

Enter the elements: 1 2 3 4 Sorted array 4 3 2 1