Пузырьковая сортировка, заменяющая значение другим, которое я даже не вводил

#arrays #c #sorting #pointers #bubble-sort

#массивы #c #сортировка #указатели #пузырьковая сортировка

Вопрос:

 #include<stdio.h>
//input function taking inputs from the user.
void input(int *p)
{
    int i;
    printf("Enter 5 numbers : ");
    for(i=0; i<=4; i  )
    {
        scanf("%d", p i);
    }
}

//display function used to display values of the array.
void display(int *p)
{
    int i;
    for(i=0; i<=4; i  )
    {
        printf("%dt", *(p i));
    }
    printf("n");
}
//Bubble Sort
void sort(int *p)
{
    int rounds, temp, i;
    for(rounds=1; rounds<=4; rounds  )
    {
        for(i=0; i<=4; i  )
        {
            if(*(p i)>*(p i 1))
            {
                temp=*(p i);
                *(p i)=*(p i 1);
                *(p i 1)=temp;
            }
        }
    }

}

//Main Function calling other functions of the program
int main()
{
    int a[5];
    input(a);
    display(a);
    sort(a);
    display(a);
    getch();
    return 0;
}
  

ВЫВОД:

 Enter 5 numbers : 34
53
97
108
347
34      53      97      108     347
34      53      77      97      108
  

значение ‘347’ автоматически заменяется на ’77’. Когда я ввожу значения >70, компилятор заменяет одно из значений на 77 и отображает его после сортировки. И если я ввожу значения <70, тогда программа работает нормально. Может кто-нибудь объяснить это, пожалуйста? И как это исправить?

Ответ №1:

Этот блок кода

         if(*(p i)>*(p i 1))
        {
            temp=*(p i);
            *(p i)=*(p i 1);
            *(p i 1)=temp;
        }
  

приводит к неопределенному поведению, когда i равно 4 , потому что выражение *(p i 1) обращается к памяти за пределами массива.

Обратите внимание, что это плохой дизайн, когда функции зависят от магического числа 4 .

Например, функция sort может быть объявлена как

 void sort( int *p, size_t n );
  

где параметр n указывает количество элементов в указанном массиве.

Ответ №2:

Когда i = 4, вы будете сравнивать и, возможно, заменять, p[4] и p[5] .

Комментарии:

1. Я этого не понимаю .. можете ли вы, пожалуйста, объяснить немного больше? с каким-нибудь примером, если бы вы могли?