我在C程序中对数组进行排序时出错

时间:2018-06-28 09:43:53

标签: c arrays sorting

我正在尝试编写一个对数组进行如下排序的C程序。我是一个初学者,对算法的了解很少。请帮助我在代码中找到错误。由于我没有收到任何编译器错误(除了少数警告),而只有程序停止响应,因此我无法检测到错误。

#include <stdio.h>
#include <stdlib.h>

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

int main () {
int n,i;


printf("Enter the number of elements:");
scanf("%d",&n);
printf("Enter %d elements :",n);

int a[n];

for (i=0 ; i<n ; i++) {
    scanf("%d",&a[i]);
}

selection_sort(n, a[n]);

for (i=0 ; i<n ; i++) {
    printf("%d ",a[i]);
}

return(0);
}

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

int i,p;

p = 0;

if (n != 0) {
    for (i=0 ; i<n ; i++) {
        if (a[i]>p) p=a[i];
    }

    p = a[n];

    selection_sort(n-1 , a[n]);
}
}

2 个答案:

答案 0 :(得分:2)

第一警告不可忽略。

我的编译器说:

  警告:指针转换不兼容的整数,将“ int”传递给“ int *”类型的参数;用&[-Wint-conversion]

获取地址
UITableView

这是一个严重问题:要传递数组时,您传递一个整数(并传递数组的末尾...)(它将衰减到其第一个元素的地址) =>这足以引发未定义的行为,并可能导致崩溃

要修复,只需致电:

   selection_sort(n, a[n]);

,然后在selection_sort(n, a); 中,递归调用:

selection_sort

完成此操作后,您的算法将是完全错误的。对于选择排序,您必须交换数组中的元素,而不必这样做。应该是:

selection_sort(n-1, a);

答案 1 :(得分:1)

您的代码中几乎没有错误。

首先,当您不了解自己所做的一切时,请将警告视为错误。因为在编译期间显示的警告是错误的情况,并导致段错误。

编译程序时,请始终使用gcc -Wall -Werror -Wextra之类的标志。它将警告视为错误。

第二,您的程序无法运行,因为您并不真正了解指针和数组的工作方式。当您声明一个整数数组,例如int a[n]并尝试访问该数组时,a[n]将指向该数组中的第一个元素。因此,如果要将数组传递给函数,则不能将int a[n]作为参数传递。因为它是一个整数。

如果要传递数组,则必须说“如果第一个元素为&a [0],我想给你地址,这与说“ a”相同。

那么您的函数应该把什么作为参数?

如果将“ int a [n]”作为参数,则将其赋予int值。但是您需要该int的地址,所以int *。

祝你好运