Ошибка сегментирования - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д