• 12 odgovora
  • 5.945 pregleda
struktura i pokazivaci pitanje 14.11.2004. u 16:45 · pre 267 meseci #1
imam sljedecu strukturu:
typedef struct cl_st {
unsigned int cid;
char ime[25] ;
char prezime [25];
char adresa [128];
char brtel [10] ;
char brlk [10] ;
struct cl_st *next;
} clan;

e sada, zelim da formiram stack, tj. jednostavnu povezanu listu.

kada uradim sljedece
clan *clan_s=NULL;

clan_s = (clan *)malloc( sizeof(clan));
clan->ime = "neki tekst";

dobijem gresku da nije Lvalue. zasto?
ps:dalje nisam pisao, formiranje liste sa push i to, jer ne razumjem zasto ovo ne radi?
Re: struktura i pokazivaci pitanje 14.11.2004. u 17:08 · pre 267 meseci #3
Uh izvinjavam se, tako mi i pise u programu nisam dobro napisao u postu:
clan_s->ime = "tekst";

ali stvar ne funkcionise!?
Re: struktura i pokazivaci pitanje 14.11.2004. u 17:55 · pre 267 meseci #4
tako se ne prave aeroplani... u ovom slucaju bi radilo:

memcpy(clan_s->ime, "neki tekst\0", 11);

u principu je nespretno drzati char buffer-e fixne velicine u strukturi, ali ako vec to moras da radis pazi da uvek ostavis prostora za jedan \0 i pazi na velicinu buffer-a i teksta koji u njega kopiras, posto ako budes kompajlirao kod sa nekim optimizacijama, lako bi moglo da se desi da takav overrun utice na rad aplikacije (da ne ulazimo u pricu o security-u, blah, blah), posto ce alocirani page-ovi biti sabijeni - sto moze rezultovanti nasty memory access problemima koji mogu biti veoma problematicni za debagovanje.
Potpis
OV SM
LA PK
Re: struktura i pokazivaci pitanje 14.11.2004. u 18:49 · pre 267 meseci #6
ja bih ipak zaobilazio strcpy... strncpy je bolji izbor posto nece kopirati vise od N bajtova, ali je opet prilicno bitno baratati sa \0-ovima kada je bilo sta sa char*-ovima u pitanju, moze ustedeti mnogo glavobolja.
Potpis
OV SM
LA PK
Re: struktura i pokazivaci pitanje 14.11.2004. u 18:53 · pre 267 meseci #7
hvala.

ma u biti ja imam zadatak da napravim neku aplikaciju za biblioteke koja koristit datoteke za smjestanje podataka uz upotrebu jednostruko spregnutih lista. eh sad, ja znam normalno uraditi to sa nizovima struktura bez problema, ali eto oko ovakvih stvari ne znam.

kako biste vi definisali strukturu?

i ah da, to mi je zadatak iz seminarskog :D
Re: struktura i pokazivaci pitanje 15.11.2004. u 08:26 · pre 267 meseci #8
Citat:
caboom: ja bih ipak zaobilazio strcpy... strncpy je bolji izbor posto nece kopirati vise od N bajtova, ali je opet prilicno bitno baratati sa \0-ovima kada je bilo sta sa char*-ovima u pitanju, moze ustedeti mnogo glavobolja.


strncpy je tek nesretan izbor. on pak nekad zapise \0, a nekad ne, ovisno o tome je li mu buffer bio dovoljno velik! UNIX man stranica kaze:

Citat:
The strncpy(3) copies not more than len characters into dst, appending \0 characters if src is less than len characters long, and not terminating dst if src is more than len characters long.
Re: struktura i pokazivaci pitanje 15.11.2004. u 12:18 · pre 267 meseci #9
poenta je to da ne treba da prepustas terminisanje stringa nekoj od postojecih stdlibc f-ja, vec da to moras da uradis sam... cisti strcpy je sjajan nacin da napravis buffer overrun.
Potpis
OV SM
LA PK
Re: struktura i pokazivaci pitanje 15.11.2004. u 13:01 · pre 267 meseci #10
Citat:
sam... cisti strcpy je sjajan nacin da napravis buffer overrun.
strncpy? A, da, kada je dužina stringa tačno jednaka n, onda ne postavlja NUL na kraj stringa, pa je opet potrebna intervencija.

Hm, čemu li služe uopšte funkcije iz runtime biblioteke?

f

[Ovu poruku je menjao filmil dana 15.11.2004. u 15:18 GMT+1]
Re: struktura i pokazivaci pitanje 15.11.2004. u 13:44 · pre 267 meseci #11
da, ali sta se desava ako sa strcpy pregazis buffer? u debug modu cesto nista, ali radosne stvari krecu da se desavaju sa npr. nekim optimizacijama. lakse je rucno zalepiti '\0', nego posle potrositi i nekoliko dana buljenja u debugger-u i raznim purify alatima da bi video sta se tacno desilo, pogotovo ako baratas slozenijim api-em i enkapsulacijama. sve u svemu, divni svet C-a i memorije.
Potpis
OV SM
LA PK
Re: struktura i pokazivaci pitanje 16.11.2004. u 13:49 · pre 267 meseci #12
Da ne bi otvarao novi topic pitat cu na ovome. Zasto u sljedecem kodu, upisuje se posljednji elemenat 2 puta u datoteku!? Naveo sam samo funkcije koje sam napisao za upis i ispis bez main() u kojem ih pozivam ... NIkako da skontam gdje sam pogrijesio ...

struct clanovi
{
int id;
char ime[20];
};


void upisdat(char ime[20])
{
FILE *Dat;
struct clanovi tmpc;

Dat = fopen(ime,"a");
if (Dat !=NULL)
{
puts("ID: ");
scanf("%d",&tmpc.id);
puts("Ime: ");
scanf("%s",&tmpc.ime);
fwrite(&tmpc,sizeof(tmpc),1,Dat);
}
else exit(1);

fclose(Dat);
}

void ispisdat(char ime[20])
{
FILE *Dat;
struct clanovi tmpc;

Dat = fopen(ime,"r");
if (Dat!=NULL)
{
puts("rezultati ispisa");
while (!feof(Dat))
{
fread(&tmpc,sizeof(tmpc),1,Dat);
printf("\n Id %d, ime %s \n",tmpc.id,tmpc.ime);
}
}
fclose(Dat);
}

Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme