我正在尝试编写一个对数组进行如下排序的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]);
}
}
答案 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 *。
祝你好运