On Sun, 9 Jan 2000, Jure Koren wrote:

> > char** funkcija() {
> >     char *enota[3];
> >     char **k_enota = enota;
> >     char niz1[] = "niz1", niz2[]="niz2";
> >     enota[0] = &niz1[0];
> >     enota[1] = &niz2[0];
> >     enota[2] = NULL;
> >     return (k_enota);
> > }

> Zdaj, ko si to pospravil, moras sele priredit **k_enota spremenljivki
> vrednost pointerja enota.
> 
> k_enota = enota;
> 
> Zdaj k_enota kaze na prvi niz (niz1), ki mu sledi drugi, in potem null.
> In ne sme vec javljat segfaulta.

Ne zastrupljaj s tako krivo vero se drugih, no! Cisto vseeno je, kdaj se
priredi vrednost spremenljivki k_enota. Do napak prihaja zato, ker je
enota (polje treh kazalcev na char) lokalna spremenljivka v funkciji
funkcija, ki se ustvari na skladu ob klicu funkcije in izgine ob njenem
koncu. Funkcija funkcija tako vrne kazalec na polje, ki po koncu te
funkcije ne obstaja vec. Oziroma Bog ve kaksne vrednosti so potem na
tistih pomnilniskih lokacijah. In ko se kasneje poskusa dostopati do teh
"neobstojecih" lokacij, so rezultati seveda zelo nepredvidljivi.

Ce se funkcija funkcija klice le enkrat, poskusi takole:


char **funkcija()
  {
    static char *enota[] = {"niz1", "niz2", (char *) NULL};

    return enota;
  }


Ce se klice veckrat, bo pa potrebno kaj v tem stilu:


char **funkcija()
  {
    char **enota;
    
    if (!(enota = (char **) malloc(3 * sizeof(char *))))
      {
        /* Neke akcije, ce ni bilo dovolj pomnilnika na voljo. */
        /* Recimo, da se program tukaj konca. */
      }
    enota[0] = "niz1";
    enota[1] = "niz2";
    enota[2] = (char *) NULL;
    return enota;
  }


Ne pozabi na primernem mestu kje naprej v programu tukaj alociran prostor
sprostiti.

Ales

-- 
Ales Casar                  | InterNet: [EMAIL PROTECTED], [EMAIL PROTECTED],
Faculty of EE & CS          |           [EMAIL PROTECTED]
University of Maribor       | DECnet:   RCUM::ALES
SLOVENIA                    | WWW:      http://www.el.feri.uni-mb.si/~ales/

Reply via email to