当我输入5 1 3 7 9 6 8 2 0 4
时
结果是0 1 2 3 3 4 5 6 7 8
9
消失了,出现了我们没有输入的另一个3
当我输入99 88 77 66 55 44 33 22 11 0
时
结果是0 3 11 22 33 44 55 66 77 88
99
消失,出现了我们没有输入的3
。怎么了?
#include<stdio.h>
void sort(int b[]){
for(int i = 0;i<10;i++){
for(int j = 0;j<10-i;j++){
if(b[j+1]<b[j]){
int temp = 0;
temp = b[j+1];
b[j+1] = b[j];
b[j] = temp;
}
}
}
}
void main(){
int a[10];
printf("please enter numbers you want to sort:\n");
for(int i = 0;i<10;i++){
scanf("%d",&a[i]);
}
printf("The number you have input were:");
for(int i=0;i<10;i++){
printf("%d ",a[i]);
}
sort(a);
printf("The sorted numbers are:");
for(int i=0;i<10;i++){
printf("%d ",a[i]);
}
}
答案 0 :(得分:2)
在某些情况下b[j + 1]
将针对j = 9
进行评估(当i
为0时会发生这种情况),因此您将访问数组范围之外的元素。
您正在执行的程序行为未定义。 (&#34;新元素&#34;您观察到的可能是由于您通过该越界访问引入它。)
答案 1 :(得分:2)
您在这里有一些未定义的行为:b[j+1]
表示您在边界之外访问的j=9
(有效b[10]
,这是b
的第11个元素,但它只包含数组的10个元素。
当你有这样的行为时,会发生什么是完全不可预测的。它可能会奏效。它可能会产生垃圾值(就像它为你做的那样)。在另一次尝试中,您的程序可能会因段错而崩溃。
答案 2 :(得分:0)
在排序
中删除中的 - i for(int j = 0; j&lt; 10-i; j ++)#include<stdio.h>
void sort(int b[]){
for(int i = 0;i<10;i++){
for(int j = 0;j<10-i;j++){
if(b[j+1]<b[j]){
int temp = 0;
temp = b[j+1];
b[j+1] = b[j];
b[j] = temp;
}
}
}
}
将其更改为
#include<stdio.h>
void sort(int b[]){
for(int i = 0;i<10;i++){
for(int j = 0;j<9;j++){ //just remove the i because it is useless.
//change the maximum iteration to 10 to prevent out of bounds exception
if(b[j+1]<b[j]){
int temp = 0;
temp = b[j+1];
b[j+1] = b[j];
b[j] = temp;
}
}
}
}
答案 3 :(得分:0)
#include<stdio.h>
void sort(int b[]){
int temp = 0;
for(int i = 0;i<10;i++){
for(int j = 0;j<10-i-1;j++){
if(b[j+1] > b[j]){
temp = b[j];
b[j] = b[j+1];
b[j+1] = temp;
}
}
}
}
int main(){
int a[10];
printf("\nplease enter numbers you want to sort:\n");
for(int i = 0;i<10;i++){
scanf("%d ",&a[i]);
}
printf("\nThe number you have input were:");
for(int i=0;i<10;i++){
printf("%d ",a[i]);
}
sort(a);
printf("\nThe sorted numbers are:");
for(int i=0;i<10;i++){
printf("%d ",a[i]);
}
return 0;
}
如果您想按顺序排序,只需更改:
b[j+1] > b[j] to b[j+1] < b[j]
试一试,它的工作正确。