Cześć Wam!
Mam taki problem. Piszę sobie implementację stosu w ANSI-C. Stos jest oparty na strukturze z tablicą 10'cio elementową intów. Gdybym to robił w C++ to bym skorzystał z dobrodziejstwa klasy ale nie robię tego tak, muszę przygotować to w C. Do tej pory mam coś takiego:
// Definicja struktury.
typedef struct
{
int tab[10];
int sptr;
int (*top)(void *s);
void (*push)(void *s, int dane);
void (*pop)(void *s);
}STOS;
int top(STOS *s)
{
if (s->sptr)
return s->tab[s->sptr - 1];
return -1;
}
void push(STOS *s, int dane)
{
if (s->sptr < 10)
s->tab[s->sptr++] = dane;
}
void pop(STOS *s)
{
if (s->sptr)
s->sptr--;
}
Czyli klasyczna struktura z wskaźnikami na funkcję - prekursor klasy.
Teraz pomyślałem aby zainicjować ją w taki sposób:
STOS init(void)
{
STOS *temp = (STOS*)malloc(sizeof(STOS));
temp->sptr = 0;
temp->top = (void*)top;
temp->push = (void*)push;
temp->pop = (void*)pop;
return *temp;
}
Czyli funkcją w której inicjuje strukturę łącznie z dynamiczną alokacją pamięci, natomiast sama funkcja zwraca wskaźnik na utworzoną strukturę.
W mainie inicjuje sobie obiekt na którym będę pracował w następujący sposób:
STOS obiekt = init(); // inicjalizacja obiektu struktury stos "obiekt".
No i teraz mam kilka pytań bo kod ogólnie działa ale:
1. NIe wiem jak zrobić coś na styl destruktora. Czy w funkcji "free()" powinienem niszczyć obiekt *temp czy "obiekt"? tak aby nie powstawały wycieki pamięci. I ewentualnie jak to zaimplementować?
2. Alokując dynamicznie pamięć dla struktury każę kompilatorowi przez funkcję malloc zarezerwować przestrzeń wielkości struktury, ale czy w takim razie zmienne w strukturze będą alokowane na stercie? Czy one są na stosie? i powinienem jeszcze zaalokować dynamicznie tablicę tab[10].
Z Góry dziękuję za odpowiedź!