Bubblesort 每次都减小大小

Bubblesort decreasing size each time

此代码:

#include <stdio.h>
#define SIZE 10

int main(){

    int a[SIZE]={2,6,4,8,10,12,89,68,45,37};
    int pass;
    int i;
    int hold;
    int dim=10;

    printf("Data items in original order\n");

    for(i=0; i<SIZE; i++){
        printf("%4d", a[i]);
    }

    for(pass=1; pass<SIZE; pass++){
        for(i=0; i<dim; i++){
            if(a[i]>a[i+1]){
                hold=a[i];
                a[i]=a[i+1];;
                a[i+1]=hold;
            }
        }
        dim--;
    }

    printf("\nData items in ascending order\n");

    for(i=0; i<SIZE; i++){
        printf("%4d", a[i]);
    }

    printf("\n");

    return 0;
}

给我这个错误:

Data items in original order
   2   6   4   8  10  12  89  68  45  37
Data items in ascending order
   2   4   6   8  10-98850560  12  37  45  68
*** stack smashing detected ***: ./prog terminated

为什么?我不明白。请向我解释一下。非常感谢你。我只是不明白。我不明白。请帮我。我不知道该怎么办。请。

stack smashing detected 表示堆栈中存在缓冲区溢出,您基本上超出了数组的范围。

int dim=10;暗淡为10

for(pass=1; pass<SIZE; pass++){  <<< First loop, dim is still 10
    for(i=0; i<dim; i++){        <<< i < 10
        if(a[i]>a[i+1]){         <<< Last loop : i=9
            hold=a[i];
            a[i]=a[i+1];;
            a[i+1]=hold;
        }
    }
    dim--;
}

i=9 a[i+1] => a[10] which is out of bound

希望对你有所帮助~~

这一行有问题:

 if(a[i]>a[i+1])

i可以上升到dim-1dim是10。所以当i变成9时,上面的表达式变成

if(a[9]>a[10])

您将访问仅包含 10 个元素的数组的第 11 个元素,因此您将访问越界内存地址。这是未定义的行为。

来自 wiki

The behavior of some programming languages—most famously C and C++—is undefined in some cases. In the standards for these languages the semantics of certain operations is described as undefined. These cases typically represent unambiguous bugs in the code, for example indexing an array outside of its bounds.

在语句中:if(a[i]>a[i+1]) 当 i = 9(此 for 循环中最多 9)时,那时您正在比较 a[9]>a[10] 但您定义的数组最多为 a[9].

将 for 循环修改为:

for(i=0; i<dim-1; i++)
    if(a[i]>a[i+1])