关于C语言排序起泡算法的问题

#include
void main()
{
int a, b, c, d; int x[9];
for (a = 1; a<=10;a++)
{
scanf_s("%d", &x[a]);
}
for (b = 1; b<=100; b++)
{
for (c = 0; c < 10-a; c++)
{
if (x[c+1] < x[c])
{
d = x[c];
x[c] = x[c+1];
x[c+1] = d;
}
}
}
for (a = 0; a < 10; a++)printf("%d\n", x[a]);
}
请问这段程序有什么问题;
在VS2013中编译运行时总出现![图片说明](https://img-ask.csdn.net/upload/201506/06/1433595764_329334.png)图片说明

当a等于10时,x越界了!

数组大小为9,for循环的a是1到10;明显越界了,而且x[0]访问不到。

第一个循环对数组x[9]赋值
for(a=0;a<10;a++)
题主的赋值直接从a[1]开始,最后一个a[10]越界

当a等于10时,那个x越界了

赋值直接从a[1]开始,最后一个a[10]越界

你数一下for (a = 0; a < 10; a++)
a从[0,10)是几个元素,而 int x[9]定义了几个元素~
一般循环写作[0,a)左闭右开的形式~这样写的原因是:a是要计数的次数,很明显。这里a应赋值整形数组元素个数9~

int x[9];
for (a = 1; a<=10;a++)//此处有10个数,而你x数组只定义了9个,数组越界。
scanf_s("%d", &x[a]);

for (a = 0; a < 10; a++)//看你的意思是要全部输出,此处的输出时要保持和输入一样,不然会出错
printf("%d\n", x[a]);

int arr[10]=[1,34,56,6,78,8,9,0,8,78];
int a;
for (int i = 0; i {
for (int j = 0; j {
//假如是升序
if (arr[j]>arr[j+1])
{
a = arr[j];
arr[j] = arr[j+1];
arr[j+1] = a;
}
}

}

for (int i = 0 ; i<10; i++)
{
printf("%d",arr[i]);
}

数组超过范围了a[10]

数组超过范围了a[10]

#include
main()
{
int a[10];
int i,j,t;
for(i=0;i scanf("%d",&a[i]);
printf("\n");
for(j=0;j for(i=0;i if(a[i]>a[i+1]){
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
for(i=0;i<10;i++)
printf("%d\t",a[i]);

}
这是最简单的冒泡排序,升序和降序只是条件判断语句中符号的改变,记得数组下标数字从0开始,一般在for循环中不取等号

越界,出现这个对话框一般都是内存问题引起的系统中断。

for (b = 1; b<=100; b++) 这一句 b的值范围取错了, 10就行了

改了下你的代码 参考下 排成升序数组

 for(b = 9; b;  b--)
 {
     a = 0;
     for(c  = 0;  c < b;  c++)
        {
            if(x[c] > x[c+1])
                {
                    d = x[c];
                        x[c] = x[c + 1];
                        x[c + 1] = d;
                        a = 1;
                }
        }
        if(0 == a)
        {
            break;
        }
 }