我在一个C程序中得到一个对数组排序的错误

我在一个C程序中得到一个对数组排序的错误,c,arrays,sorting,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:"

我正试图编写一个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]);
}
}
#包括
#包括
无效选择_排序(int n,int a[n]);
int main(){
int n,i;
printf(“输入元素数:”);
scanf(“%d”和“&n”);
printf(“输入%d个元素:”,n);
int a[n];

对于(i=0;i,代码中几乎没有错误

首先,当你不理解你所做的一切时,把警告看作是错误。因为在编译过程中显示的警告是错误的,导致Sebug。

编译程序时,始终使用诸如
gcc-Wall-Werror-Wextra等标志。它将警告视为错误

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

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

那么你的函数应该取什么作为参数呢

如果你给“inta[n]”作为参数,你给它一个int。但是你想要那个int的地址,所以int*


好运

第一次警告不可忽视

我的编译器说:

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

   selection_sort(n, a[n]);
这是一个严重的问题:当您要传递数组(它将衰减到其第一个元素的地址)时,传递一个整数(并传递数组的末尾…)=>这足以调用未定义的行为,并可能导致崩溃

需要修复的小问题,只需调用:

selection_sort(n, a);
然后在
选择\u排序
中,递归调用:

selection_sort(n-1, a);
完成此操作后,您的算法显然是错误的。对于选择排序,您必须交换数组中的元素,而您不需要交换。它应该是:

if (n != 0) {
    for (i=0 ; i<n ; i++) {
        if (a[i]>a[p]) p=i;            # first select the rank
    }

    if (p != n-1) {                    # then exchange elements
        int tmp = a[p];
        a[p] = a[n-1];
        a[n-1] = tmp;
    }
如果(n!=0){
对于(i=0;ia[p])p=i;#首先选择排名
}
如果(p!=n-1){#则交换元素
int tmp=a[p];
a[p]=a[n-1];
a[n-1]=tmp;
}

为什么传递
a[n]
这里
selection\u sort(n,a[n]);
假设
n
5
那么
a[5]
就不存在了。越界,导致未定义的行为。可能你想要像
selection\u sort(n,a);
不相关,但不写
返回(0);
return
不是函数。写入
return 0;
return(0);
没有错,只是不寻常。感谢您指出错误@achal@Jabberwocky谢谢你的提示。我是初学者,所以我的课本教我返回(0)谢谢你提出的宝贵建议。我一定会以我的方式马上改正的。