【问题标题】:Segfault error in array sorting algorithm in CC中数组排序算法中的段错误
【发布时间】:2016-11-27 11:16:06
【问题描述】:

我是编程初学者,我正在阅读 K.N.King 的“C 编程:一种现代方法”。现在我正在尝试编写第 9 章的编程项目 1,但我不断收到段错误,我不确定代码有什么问题。任何更正表示赞赏!

这些是说明:

编写一个程序,要求用户输入一系列整数(将其存储在一个数组中),然后通过调用函数 selection_sort 对整数进行排序。当给定一个包含 n 个元素的数组时,selection_sort 必须执行以下操作:
1. 搜索数组找到最大的元素,然后移动到数组的最后一个位置。
2.递归调用自身对数组的前n-1个元素进行排序。

这是我的代码:

#include <stdio.h>

void selection_sort(int n, int a[n]);

int main(void)
{
    int n;

    printf("Number of integers to sort: ");
    scanf("%d", &n);

    int a[n];

    printf("Enter the integers: ");
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    selection_sort(n, a);

    printf("Sorted array: ");
    for (int i = 0; i < n; i++)
        printf("%d", a[i]);

    return 0;
}

void selection_sort(int n, int a[n])
{
    int swap, max = a[n - 1];

    for (int i = 0; i < n; i++) {
        if (a[i] > max) {
            max = a[i];
            swap = a[n - 1];
            a[n - 1] = max;
            a[i] = swap;
        }
    }
    if (n > 1)
        selection_sort(n - 1, a);
}

编辑:将 while (n > 1) 更改为 if (n > 1),现在它可以正常工作了。但是为什么它不能与 while 一起工作呢?

【问题讨论】:

  • 段错误在哪里?
  • 你好无限递归......你需要在某个时候打破递归(使用一个基本情况来检查它是否应该停止)。
  • 在学习 C 语言时,您还必须学习使用调试器。单步执行此代码将清楚问题所在。
  • 或者只是在 selection_sort 开始时打印参数

标签: c arrays


【解决方案1】:

你需要有一些递归的基本条件,以避免无休止地调用同一个函数。你可以这样做

void selection_sort(int n, int a[])
{
    if(n<=0)return;  //base condition
    int swap, max = a[n - 1];

【讨论】:

    【解决方案2】:

    你需要一个不调用selection_sort的条件。就像现在一样,您的selection_sort 总是 调用selection_sort,这会导致无限循环。

    而且,由于您在每一步都递减n,因此在某一时刻它变为负数,您开始访问a[-1],这是错误的。

    【讨论】:

    • 条件必须是n &gt; 0,而不是n &gt;= 0,因为你稍后会计算n - 1。而且,由于这是一种排序算法,n &gt; 1 甚至更好,因为不需要对具有 1 个元素的数组进行排序。
    • 谢谢,现在它没有段错误,但它在等待输入整数时挂起,似乎卡在将每个值分配给数组中对应元素的循环中。
    • 此时需要检查scanf是否成功。只有当它返回1(正确读取的字段数)时,您才应该继续程序。我听说有传言说写scanf(" %d", &amp;var)%d 前面有一个空格会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多