#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. Я этого не понимаю .. можете ли вы, пожалуйста, объяснить немного больше? с каким-нибудь примером, если бы вы могли?