万重云 2022-02-27 21:33 采纳率: 0%
浏览 52

关于冒泡排序里数组访问越界(?)的问题

问题

DevC++没有报错
在线编程网站提示可能是数组访问越界,但是我不太理解哪里会出现越界。
所以想请教一下。

相关代码
#include<stdio.h>
int main()
{
    int a[2];     //如果改为3就不会报错了,也不会有问题
    scanf("%d%d%d", &a[0],&a[1],&a[2]); 
            
    for(int i = 0; i < 2; i=i+1)   //就是一个冒泡排序
    {
        for(int j = 0; j < 2-i; j = j+1)
        {
            if(a[j+1]<a[j])
            {
                int x;
                x = a[j];
                a[j] = a[j+1];
                a[j+1] = x;
            }
        }
    }
    printf("%d %d %d\n", a[0], a[1], a[2]);

    
    
    return 0;
}

运行结果及报错内容

int a[2];
输入5 2 7,会得到5 5 2
但如果是 int a[3];
输入5 2 7,会得到7 5 2

DevC++没有报错
在线编程网站提示可能是数组访问越界

我的解答思路和尝试过的方法

调试过程中发现在冒泡排序的循环里
int x;
x = a[j];
a[j] = a[j+1];
a[j+1] = x;
第一次运行这几排(交换两个数字位置),a[2]的值就出现了错误。

  • 写回答

4条回答 默认 最新

  • 易水卷长空 2022-02-27 22:15
    关注

    int a[2]包含且只包含两个元素a[0]、a[1]。你下一条scanf语句访问a[2]肯定越界了。。。
    数组a的长度可以开大一点没关系,至少也要大于等于3。
    下面是冒泡排序的C语言代码,可以参考一下:

    //注意:由于每趟冒泡至少能把序列中最大的数找出来,所以不必每趟冒泡都把整个数组遍历一遍
    /*冒泡排序,从小到大*/
    void bubbleSort(int a[],int n){
        bool exchange = true;
        for(int ends=n-1;ends>0&&exchange;ends--){
            exchange = false;
            for(int i=0;i<ends;i++){
                if(a[i]>a[i+1]){
                    int m=a[i];
                    a[i]=a[i+1];
                    a[i+1]=m;
                    exchange=true;
                }
            }
        }
        return;
    }
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 2月27日

悬赏问题

  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响
  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)