Нарушение прав доступа при чтении "0xa99e99d8" - C (СИ)
Формулировка задачи:
При компиляции программы
Microsoft Visual Studio 2010 выдает следующее сообщение
" Необработанное исключение в "0x01171403" в "e.exe": 0xC0000005: Нарушение прав доступа при чтении "0xa99e99d8". "
Хотя компиляция вроде бы проходит....
Скажите пож-ста, почему может появляться такое сообщение..
Заранее спасибо
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define BOOL int
#define TRUE 1
#define FALSE 0
int Qsort(int left, int right,int* a) //сортировка из методички по лабам :=)
{
int index = 0; //количество стравнений
int i, j, key, buf;
key = a[(left + right)/2];
i = left;
j = right;
do
{
while (a[i] < key)
{
i++;
index++;
}
while (key < a[j])
{
j--;
index++;
}
if (i <= j)
{
buf = a[i];
a[i] = a[j];
a[j] = buf;
i++;
j--;
}
} while (i <= j);
if (left < j)
index += Qsort(left, j, a);
if (i < right)
index += Qsort(i,right, a);
return index;
}
int main()
{
int n, p, K, *mas,index,i; //размер массива
printf_s("processing results in files antiqs.in and antiqs.out\n");
freopen("antiqs.in","r",stdin); //направляем поток в файл
freopen("antiqs.out","w",stdout);
scanf("%i",&n); //максимальный элемент
mas = (int*)malloc((n+1)*sizeof(int));
mas[0] = 1;
for (K = 0; K <= n; K++) //генерируем последовательность, которая будет хуже всего для сортировки
{
p = (1 + K) / 2;
mas[K] = mas[p];
mas[p] = K;
}
for (i = 0;i<n;++i)
printf("%d ",mas[i]);
index = Qsort(0,n,mas);
free(mas);
while(TRUE);
return NULL;
}Решение задачи: «Нарушение прав доступа при чтении "0xa99e99d8"»
textual
Листинг программы
int main()
{
int n;
int p, K, *mas,index,i;
freopen("antiqs.in","r",stdin); //направляем поток в файл
freopen("antiqs.out","w",stdout);
scanf("%i",&n); //максимальный элемент
mas = (int *) malloc(n * sizeof(int));
if (mas == NULL)
return 1;
mas[0] = 1;
for (K = 0; K < n; K++) //генерируем последовательность, которая будет хуже всего для сортировки
{
p = (1 + K) / 2;
mas[K] = mas[p];
mas[p] = K;
}
index = Qsort(0, n, mas);
for (i = 0; i < n; ++i)
printf("%d ", mas[i]);
free(mas);
getchar();
getchar();
return 0;
}
Объяснение кода листинга программы
- Объявлены переменные: n - количество элементов в массиве; p, K, *mas,index,i - указатели на переменные;
- Открыты файлы
antiqs.inиantiqs.outдля чтения и записи соответственно. - Считано значение переменной n с помощью функции scanf.
- Выделена память под массив mas с помощью функции malloc. Если память не может быть выделена, то возвращается 1.
- Первый элемент массива установлен в 1.
- В цикле K генерируется последовательность для сортировки, которая будет хуже всего для сортировки.
- В цикле i происходит сортировка массива с помощью функции Qsort.
- В цикле i выводятся элементы массива с помощью функции printf.
- Выделенная память освобождается с помощью функции free.
- Программа ожидает ввода с клавиатуры с помощью функции getchar.
- Программа завершается с возвратом значения 0.