Jos määritellään
time_t taim;
struct tm *aika, nyt;
time(taim);
aika = localtime(&taim); //OK
nyt = localtime(&taim); // Ei OK
miksi tuo alin rivi antaa herjaa???
time_t taim;
struct tm *aika, nyt;
time(taim);
aika = localtime(&taim); //OK
nyt = localtime(&taim); // Ei OK
miksi tuo alin rivi antaa herjaa???
Vastaukset 9
Vanhimmat
>miksi tuo alin rivi antaa herjaa???
Eikös siinä herjassa lue se syy ?
Siis muuttuja "aika" on tyyppiä pointteri jonka localtime palauttaa, muuttuja "nyt" taas ei.
"The localtime and gmtime subroutines return a pointer to the struct tm."
http://publibn.boulder.ibm.com/doc_link/en_US/a_doc_lib/libs/basetrf1/ctime.htm
Nyt kun sen noin sanoit, niin tajusin itsekkin.
Jatketaan tyhmillä kysymyksillä, kun on kerran päästy vauhtiin.
Jos määritellään:
struct tm *nyt, *aika;
Niin mihin nuo *muuttujat osoittavat jos mitään
osoitetta ei niille anneta. Samaan paikkaan??
tilansa.
"struct tm *nyt, *aika;"
olet niille osoitteen antanut.
Tällaista pohdin...
int main(void) {
struct tm *eka, *toka;
time_t t;
time(&t);
eka = localtime(&t);
toka = localtime(&t);
printf("eka:%stoka:%s", asctime(eka), asctime(toka));
toka = gmtime(&t);
printf("\neka:%stoka:%s", asctime(eka), asctime(toka));
return 0;
}
Miksi tuo "eka"(kin) tuossa jälkimmäisessä tulostuksessa muuttuu gm ajaksi, vaikka se annetaan "toka"lle??
Johtuu siitä, että localtime() palauttaa osoitteen staattiseen bufferiin. Tuo on ns. non-re-entrant funktio. Mikäli haluat, että se käyttää sinun varaamaa bufferia, käytä funktiota localtime_r().
Tuossa tapauksessa muuttujien sisältö on sitä, mitä pinossa (stack) sattuu juuri tolla hetkellä olemaan (eli jotain roskaa). Ne siis eivät ole valideja muistiosoitteita.
Eivät siis välttämättä samaan paikkaan. Tuollaisina niiden dereferointi aiheuttaa segmentation violation -trapin ja prosessi keskeytetään.
struct tm *aika, nyt;
aika on pointteri(osoite) tm-tyyppiseen struktuuriin (todennäkoisesti 4 bytea pitkä).
nyt on tm-tyyppinen struktuuri (todennäköisesti paljon suurempi)
localtime() varaa itse tilaa sille struktuurille ja antaa sinulle vain osoitteen siihen. Eli tapauksessa nyt=localtime() yrität kopioida sisällön jo luodusta struktuurista omaan struktuuriin (mikä ei tietenkään onnistu)
Kun luot osoitemuuttujia (tai muuttujia) varaat nille tilaa, mutta niiden sisältö voi olla mitä tahansa ennen kuin itse määrittelet sen. Tavallinen ohjelnointivirhe on että olettaa että sisältö on nolla.
Asia alkaa pikkuhiljaa hahmottua. Paljonhan tässä on vielä kysymysmerkkejä, mutta ainakin pvmlaskuri tuli suunnilleen valmiiksi.
Kiitos vastanneille.