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

问题

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]的值就出现了错误。

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;
}
    for(int j = 0; j < 2-i; j = j+1)

改成

   for(int j = 0; j < 2-i-1; j = j+1)

冒泡排序的时候,如果数组的个数是n,那么
外层for循环是:

for( int i=0;i<n-1;i++)

内层for循环是:

for(int j=0;j<n-1-i;j++)

所以,你数组是int a[2]的时候,n=2,带入上面的代码中,
外层for循环应该是:

for( int i=0;i<2-1;i++)  // 或者  for( int i=0;i<1;i++) 

内层for循环应该是:

for(int j=0;j<2-1-i;j++)  // 或者 for(int j=0;j<1-i;j++)

img

这是python中的冒泡排序,可以参看着看问题出在哪里