Размер пузырьковой сортировки уменьшается каждый раз - PullRequest
0 голосов
/ 24 августа 2018

Этот код:

#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 голосов
/ 24 августа 2018

Проблема с этой строкой:

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

i может пойти до dim-1, а dim равно 10. Поэтому, когда i становится 9, вышеприведенное выражение становится

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

Вы получите доступ к 11-му элементу массива, который содержит только 10 элементов, и, таким образом, вы получите доступ к адресу вне пределов памяти. Это неопределенное поведение.

Из вики :

Поведение некоторых языков программирования, в частности C и C ++, в некоторых случаях не определено. В стандартах для этих языков семантика определенных операций описана как неопределенная . Эти случаи обычно представляют однозначные ошибки в коде, например , например, индексацию массива за его пределами.

0 голосов
/ 24 августа 2018

В операторе: if(a[i]>a[i+1]), когда i = 9 (максимум 9 в этом цикле for), в этот раз вы сравниваете a[9]>a[10], но вы определили массив до a[9].

Изменить это для цикла как:

for(i=0; i<dim-1; i++)
    if(a[i]>a[i+1])
0 голосов
/ 24 августа 2018

stack smashing detected означает, что в стеке переполнен буфер, вы в основном вышли за пределы массива.

int dim=10; dim равен 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], который вышел за пределы

Надеюсь, это поможет ~~

...