Ошибка EXC_BAD_ACCESS - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
 
int i,f,n,k,b,q,x,v,q1;
b=v=0;
x=2;
double a[n];
scanf ("%d", &n);
f=n;
FILE *fp=fopen("a.txt", "r");
for (i=1; i<=n; i++)
{
fscanf(fp, "%lf", a+i);
}
for(k=2;k<n;k++)
{
if(a[k]<pow(a[k-1]*a[k+1],0.5))
{
f--;
b++;
if(k+1==n)
{
for(q=x; q<n; q++)
{
a[q]=a[q+1];
}
return f;
}
else
continue;
}
else
{
v++;
if(b>0)
{
for(q1=v+1;q1<n;q1++)
{
a[q1]=a[q1+1];
}
}
x++;
b=0;
 
}
}
}
Программа по идее должна удалять элементы которые меньше корня из произведения двух соседних. Но она недоработана. При n=4 выдает ошибку к 20 строке
Thread 1: EXC_BAD_ACCESS(code=EXC_I386_GPFLT)
. Может пояснить кто-нибудь, в чем эта ошибка заключается ?

Решение задачи: «Ошибка EXC_BAD_ACCESS»

textual
Листинг программы
double *a = NULL;
int n, i;
 
scanf("%d", &n);
a = calloc(n, sizeof(*a));
if(NULL == a) {
    fputs("error : no memory", stderr);
    exit(-1);
}
for(i = 0; i < n; ++i) {
    a[i] = i;
}
free(a);

Объяснение кода листинга программы

  1. Объявлены две переменные: a типа double* и n типа int.
  2. С помощью функции scanf в переменную n считывается число, которое будет использоваться для выделения памяти под массив.
  3. С помощью функции calloc в переменную a выделяется память под массив n элементов типа double.
  4. Если выделение памяти не удалось (функция calloc вернула NULL), то выводится сообщение об ошибке и программа завершается.
  5. Если выделение памяти удалось, то выполняется цикл for, в котором каждый элемент массива a инициализируется значением i.
  6. После окончания цикла массив a освобождается с помощью функции free.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5