Naprogramoval som rekurzívnu dátovú štruktúru lineárny spájaný zoznam bez nárazníka v jazyku C, funguje ako má, len som náhodou zistil, že predsa pri určitách zmenách v programe padne.
Definícia štrukúr:Kód:
typedef struct{
char meno[10];
char priezvisko[20];
int hodnota;
}ZAZNAM;
typedef struct atom{
ZAZNAM *p_zaznam;
struct atom *p_dalsi;
}ATOM;
typedef struct{
ATOM *p_zac, *p_index, *p_kon;
}ZOZNAM;
Nebudem tu písať celý program, je vcelku obsiahlejší, ale napíšem len problematické časti. Príčina chyby bude určite v nich.
1. chyba.Definujem si premennú ZOZNAM *p_zoznam; Pracujem s ňou, všetko funguje ako má. Ale ako náhle som si definoval premennú ZAZNAM zaz; program začal padaj. Konkrétne padá pri inicializácii *p_zoznam.
Inicializácia vyzerá takto:Kód:
void ini(ZOZNAM **p_zoznam)
{
(*p_zoznam)->p_zac = (*p_zoznam)->p_index = (*p_zoznam)->p_kon = NULL;
}
Volám ju:Kód:
ini(&p_zoznam);
Ako náhme namiesto ZAZNAM zaz, dekrarujem a definujem pointer na ZAZNAM a alokujem pre neho pamäť,
Kód:
ZAZNAM *p_zaz = (ZAZNAM*)malloc(siezeof(ZAZNAM);
všetko funguje ako má, len samozrejme musím pracovať s premennou p_zaz ako s pointerom.
Prečo je tomu tak?2. chybaVždy pri alokácii pamäte testujem či je dosť pamäte:
Kód:
if(((*p_zoznam)->p_zac = (ATOM*)malloc(sizeof(ATOM))) == NULL)
{
printf("Malo pamate");
exit(1);
}
Avšak som nechtiec urobil chybu if(((*p_zoznam)->p_zac = (ATOM*)malloc(sizeof(ATOM))) != NULL) - namiesto == som použil != a program spadol i keď sa mal len ukončiť. Vypísalo sa "Malo pamate" a namiesto ukončenia programu, program spadol.
Deje sa to len v tomto bloku kódu:Mám makrá :
#define atm (ATOM*)malloc(sizeof(ATOM))
#define zaz (ZAZNAM*)malloc(sizeof(ZAZNAM))
#define test_pamate {printf("Malo pamate"); exit(1);}
Kód:
void pridaj(ZOZNAM **p_zoznam, ZAZNAM *zaznam)
{
if(test(*p_zoznam))
{
if(((*p_zoznam)->p_zac = atm) == NULL)
test_pamate;
if(((*p_zoznam)->p_zac->p_zaznam = zaz) == NULL)
test_pamate;
(*p_zoznam)->p_zac->p_zaznam->hodnota = zaznam->hodnota;
strcpy((*p_zoznam)->p_zac->p_zaznam->meno, zaznam->meno);
strcpy((*p_zoznam)->p_zac->p_zaznam->priezvisko, zaznam->priezvisko);
(*p_zoznam)->p_zac->p_dalsi = NULL;
(*p_zoznam)->p_kon = (*p_zoznam)->p_index = (*p_zoznam)->p_zac;
}
else if(test_kon(*p_zoznam))
{...
Funkciu pridaj volám bezprostredne po inicializácii a tento blok kódu vytvára prvý atóm v zozname, nech kdekoľvek do tohoto bloku pridám exit(1); program spadne. Taktiež som zistil že ak inicializujem zoznam a nič do neho nepridám len hneď zavolám funkciu exit, program namiesto ukončenia spadne. Takže táto chyba sa zrejme sťahuje len na inicializovaný zoznam v ktorom nie sú žiadné atómy.
Vedeli by ste mi povedať prečo?