Ошибка сегментирования - C (СИ) (72095)

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

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

Прошу помочь найти ошибку сегментирования в коде.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define NMAX 10
 
struct polinom
{
    double *elem;
    unsigned int n;
    int top;
};
void init(struct polinom *stk)
{
    stk->top = 0;
}
void push(struct polinom *stk, float f)
{
if(stk->top < NMAX) {
    stk->elem[stk->top] = f;
    stk->top++;
  } else
    printf("stec polon,kol-vo elementov: %d !\n", stk->top);
}
float pop(struct polinom *stk)
{
  float elem;
  if((stk->top) > 0) {
    stk->top--;
    elem = stk->elem[stk->top];
    return(elem);
   } else {
    printf("stec pust!\n");
    return(0);
  }
}
float stkTop(struct polinom *stk)
{
  if((stk->top) > 0) {
    return( stk->elem[stk->top-1]);
  } else {
    printf("stec pust!\n");
    return(0);
  }
}
int gettop(struct polinom *stk)
{
    return(stk->top);
}
 int isempty(struct polinom *stk)
{
  if((stk->top) == 0)    return(1);
  else return(0);
}
void stkPrint(struct polinom *stk)
{
  int i=stk->top;;
  if(isempty(stk)==1) return;
  do {
    i--;
    printf("%f\n", stk->elem[i]);
  }while(i>0);
}
void PrintfPolinom(polinom * p)
{
    for (int i=p->n; --i>=1;)
        printf("%.2lf*x^%i + ",p->elem[i],i);
    printf("%.2lf",p->elem[0]);
}
polinom * CreatePolinom()
{
    float elem;
    polinom *p= (polinom *) malloc(sizeof(polinom));// ввод количества коэффициентво без проверки на дурака
    init(p);
    printf("vvidite kollichestvo coifecentov: ");
    scanf("%i",&(p->n));
    p->elem = (double *) calloc(p->n, sizeof(double));// выделяем память под коэффициенты
    for (int i=0; i<p->n; i++)
    {
        printf("vvedite coifecentu x^%i: ",i);
        scanf("%lf",&elem);
        push(p,elem);
    }
    return p;
}
int main(void)
{
    struct polinom *stk;
    int i,n;
    float k;
    char m;
    polinom *a;
do
  {
    printf ("\n 1-vvod-vuvod polinoma;2 - stec; 3-sohranenie v fail; 0 - exit");
    printf ("\n");
    m=getch();
    printf ("\n");
      switch (m)
       { case '1':
           {
              if ((a=CreatePolinom()) == NULL)
                exit(EXIT_FAILURE);
              PrintfPolinom(a);
              getch();
              break;
           }
         case '2':
           {
               //stk = (struct polinom*)malloc(sizeof(struct polinom));
               //init(stk);
               printf("v stece %d elementov\n", gettop(a));
               printf("\n");
               stkPrint(a);
               printf("verhniu element %f\n",stkTop(a));
               do
                   {
                     printf("izvlekaem element %f, ", pop(a));
                     printf("v stece ostaloc %d elementov\n", gettop(a));
                   }
               while(isempty(a)==0);
               getchar();
               getchar();
               return 0;
            }
      }
  }
while(m!='0');
system ("pause");
return 0;
}

Решение задачи: «Ошибка сегментирования»

textual
Листинг программы
struct polinom
{
    float *elem;
    unsigned int n;
    int top;
};
//...
polinom * CreatePolinom()
{
    float elem;
    polinom *p= (polinom *) malloc(sizeof(polinom));// ввод количества коэффициентво без проверки на дурака
    init(p);
    printf("vvidite kollichestvo coifecentov: ");
    scanf("%i",&(p->n));
    p->elem = (float *) calloc(p->n, sizeof(float));// выделяем память под коэффициенты
    for (int i=0; i<p->n; i++)
    {
        printf("vvedite coifecentu x^%i: ",i);
        scanf("%f",&elem);
        push(p,elem);
    }
    return p;
}

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

  1. Структура polinom содержит указатель elem на массив коэффициентов полинома и два целочисленных поля n и top.
  2. Функция CreatePolinom создает экземпляр структуры polinom с помощью malloc, выделяет память под массив коэффициентов с помощью calloc и запрашивает у пользователя количество коэффициентов и сами коэффициенты.
  3. В цикле for с помощью scanf пользователь вводит коэффициенты полинома, которые сохраняются в массиве elem с помощью функции push.

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


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

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

7   голосов , оценка 4.286 из 5
Похожие ответы