c语言冒泡排序相关问题

img

img

img


想问下为什么有时对有时不对啊,数一大就会把最大的那个数自动换成26然后进行排序,感觉好奇怪

既然你开的数组是10,那么你应该使用0-9的下标。不过当溢出量不多时C++会自动申请后面的很少的连续地址。
不过我想告诉你的是,如果你在主函数里面开数组。那就是从栈中开空间,但是栈中是会有上一次别的进程的残余,所以如果你没有输入,就一定要初始化,不然就会出现一些你不知道的东西(别的进程的垃圾),你用的是地址1-10。0地址你没有用,然而你只是给1~10的地址输入赋了初值,0地址没有,所以就会出现上一次的垃圾,这个遗留垃圾的ASCLL码是26


#include<stdio.h>
int main(){
    long int i,j,a,b,c;
    int number=10;
    long int sum[10];
    for(i=0;i<10;i++){
        scanf("%d",&sum[i]);
    }
    for(number=10;number>0;number--){
        a=0;
        for(a=0;a<number;a++){
            if(sum[a]>sum[a+1]){
                b=sum[a];
                sum[a]=sum[a+1];
                sum[a+1]=b;
            }
        }
    }
    for(c=0;c<10;c++){
        printf("%d ",sum[c]);
    }
    return 0;
}

如果我用你的代码。
就会出现垃圾内存34

img

如果我改成这个

#include<stdio.h>
int main(){
    long int i,j,a,b,c;
    int number=10;
    long int sum[10];
    for(i=0;i<10;i++){
        scanf("%d",&sum[i]);
    }
    for(number=9/*这里*/;number>0;number--){
        a=0;
        for(a=0;a<number;a++){
            if(sum[a]>sum[a+1]){
                b=sum[a];
                sum[a]=sum[a+1];
                sum[a+1]=b;
            }
        }
    }
    for(c=0;c<10;c++){
        printf("%d ",sum[c]);
    }
    return 0;
}

那就是正确答案

img