Размер массива sorted
равен 1024:
long sorted[1024];
, что означает действительный индекс массива sorted
в диапазоне от 0
до 1023
.
В функции insert_sorted()
вы пытаетесь получить доступ к массиву sorted
вне его диапазона:
sorted[1024] = value;
^^^^
Доступ к элементу массива сверх его размера является неопределенным поведением, которое включает в себя программу, которая может вызвать ошибку сегментации.
На самом деле в функции insert_sorted()
есть логическая ошибка. Это никогда не сохраняет первое значение в соответствующем месте в массиве sorted
из-за этой проверки значения count
:
if (count == 0) return;
Впервые значение count
будет равно 0
, и функция вернется без сохранения value
в соответствующем месте в массиве sorted
. Кроме того, вы должны установить значение count
и, если оно больше размера массива, функция должна выдать соответствующее сообщение об ошибке. Вы можете сделать:
#define ARR_SZ 1024
void insert_sorted(long *sorted, int count, long value) {
int i = 0;
if (count > ARR_SZ) {
fprintf (stderr, "Array is exhausted");
//may you want to change the return type of function from void to
//int and return a value in case of error.
//Based on the return value, the caller of this function can take
//appropriate action.
return;
}
for (i = count; i > 0; i--) {
if (value < sorted[i - 1])
sorted[i] = sorted[i - 1];
else
break;
}
sorted[i] = value;
}
int main(int argc, char *argv[])
{
FILE *infile = NULL;
int count = 0;
long sorted[ARR_SZ];
......
......
......
}
Когда вы принимаете index
ввод от пользователя, обязательно добавьте проверку, является ли он меньше 0
или больше или равен count
. Если это так, вы не должны получить доступ к sorted[index]
.
scanf("%d", &index);
if ((index >= count) || (index < 0)) {
//print error message and do not access sorted[index]
}
Тебе это не нужно:
if (index == -1)
fclose(infile);
из-за этого, когда пользователь вводит -1
, fclose
вызывается дважды для infile
. Убедитесь, что как только вы закрыли FILE *
открытого файла, не вызывайте fclose
снова для него.