Bubblesort每次减小大小

时间:2018-08-24 08:57:59

标签: c bubble-sort

此代码:

#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

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

3 个答案:

答案 0 :(得分:3)

问题在于此行:

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

i可以升至dim-1dim为10。因此,当i变为9时,上述表达式变为

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

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

来自wiki

  

某些编程语言(最著名的是C和C ++)的行为在某些情况下是不确定的。在这些语言的标准中,某些操作的语义被描述为未定义。这些情况通常代表代码中明确的错误,例如,在数组边界之外建立索引。

答案 1 :(得分:0)

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]超出范围

希望有帮助~~

答案 2 :(得分:0)

在语句: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])