Ошибка сегментирования - 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;
}
Объяснение кода листинга программы
- Структура
polinomсодержит указательelemна массив коэффициентов полинома и два целочисленных поляnиtop. - Функция
CreatePolinomсоздает экземпляр структурыpolinomс помощьюmalloc, выделяет память под массив коэффициентов с помощьюcallocи запрашивает у пользователя количество коэффициентов и сами коэффициенты. - В цикле
forс помощьюscanfпользователь вводит коэффициенты полинома, которые сохраняются в массивеelemс помощью функцииpush.