我在一个C程序中得到一个对数组排序的错误
我正试图编写一个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:"
#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)谢谢你提出的宝贵建议。我一定会以我的方式马上改正的。