Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
defar Forumaš(ica)


Pridružen/a: 19. 01. 2004. (01:37:19) Postovi: (152)16
|
Postano: 0:57 uto, 13. 4. 2004 Naslov: pointeri |
|
|
kakve sve informacije sadrzava varijabla int *br=malloc(sizeof(int)), npr?
jel to samo adresa? nema veze s tipom na koji pointer "pokazuje"?
ukratko, ako hocu alocirati memoriju za pointer na neku danu strukturu,
koliko memorije moram alocirat? isto kao i za svaki drugi pointer ili ovisi o tipu?
kakve sve informacije sadrzava varijabla int *br=malloc(sizeof(int)), npr?
jel to samo adresa? nema veze s tipom na koji pointer "pokazuje"?
ukratko, ako hocu alocirati memoriju za pointer na neku danu strukturu,
koliko memorije moram alocirat? isto kao i za svaki drugi pointer ili ovisi o tipu?
_________________ `To begin with, a dog's not mad. You grant that? 'Well, then,' the Cat went on, `you see, a dog growls when it's angry, and wags its tail when it's pleased. Now I growl when I'm pleased, and wag my tail when I'm angry. Therefore I'm mad.'
|
|
[Vrh] |
|
krcko Forumaš nagrađen za životno djelo


Pridružen/a: 07. 10. 2002. (15:57:59) Postovi: (18B3)16
|
Postano: 9:22 uto, 13. 4. 2004 Naslov: Re: pointeri |
|
|
[quote="defar"]kakve sve informacije sadrzava varijabla int *br=malloc(sizeof(int)), npr?
jel to samo adresa?[/quote]
Da, to je samo adresa prvog bajta.
[quote="defar"]nema veze s tipom na koji pointer "pokazuje"?[/quote]
Ima, jer malloc rezervira tocno onoliko memorije iza te adrese koliko si trazila. Mislim da bi za int bilo 4 bajta.
[quote="defar"]ukratko, ako hocu alocirati memoriju za pointer na neku danu strukturu,
koliko memorije moram alocirat? isto kao i za svaki drugi pointer ili ovisi o tipu?[/quote]
Ovoliko: sizeof(struktura). Ovisi o strukturi, naravno (neki tipovi trebaju vise memorije, neki manje). No malloc uvijek vraca pointer na pocetak komada memorije koji je rezervirao.
defar (napisa): | kakve sve informacije sadrzava varijabla int *br=malloc(sizeof(int)), npr?
jel to samo adresa? |
Da, to je samo adresa prvog bajta.
defar (napisa): | nema veze s tipom na koji pointer "pokazuje"? |
Ima, jer malloc rezervira tocno onoliko memorije iza te adrese koliko si trazila. Mislim da bi za int bilo 4 bajta.
defar (napisa): | ukratko, ako hocu alocirati memoriju za pointer na neku danu strukturu,
koliko memorije moram alocirat? isto kao i za svaki drugi pointer ili ovisi o tipu? |
Ovoliko: sizeof(struktura). Ovisi o strukturi, naravno (neki tipovi trebaju vise memorije, neki manje). No malloc uvijek vraca pointer na pocetak komada memorije koji je rezervirao.
_________________ Vedran Krcadinac
Ljudi su razliciti, a nula je paran broj.
|
|
[Vrh] |
|
defar Forumaš(ica)


Pridružen/a: 19. 01. 2004. (01:37:19) Postovi: (152)16
|
Postano: 12:06 uto, 13. 4. 2004 Naslov: |
|
|
long time no see :D
ma jsno mi je da ak imam
struct node *point, i hocu alocirat mem za strukturu node, moram malloc funkciji kao
parametar navest velicinu node-a.
ali ako hocu alocirat mem za pointer na node:
typedef struct node *node_ptr;
node_ptr *pointeri;
i sad hocu alocirat polje od n pointera na node,
onda pisem pointeri=malloc(n*sizeof(???))
e, sad znam. 4 bajta dakle (akording to some fellow students - adresa tog prvog bajta je jedan integer):) tako sam nesto i mislila, ali daaaaaaaaaaavno je to bilo:)
thank you verrrry much, monsieur
long time no see
ma jsno mi je da ak imam
struct node *point, i hocu alocirat mem za strukturu node, moram malloc funkciji kao
parametar navest velicinu node-a.
ali ako hocu alocirat mem za pointer na node:
typedef struct node *node_ptr;
node_ptr *pointeri;
i sad hocu alocirat polje od n pointera na node,
onda pisem pointeri=malloc(n*sizeof(???))
e, sad znam. 4 bajta dakle (akording to some fellow students - adresa tog prvog bajta je jedan integer) tako sam nesto i mislila, ali daaaaaaaaaaavno je to bilo:)
thank you verrrry much, monsieur
_________________ `To begin with, a dog's not mad. You grant that? 'Well, then,' the Cat went on, `you see, a dog growls when it's angry, and wags its tail when it's pleased. Now I growl when I'm pleased, and wag my tail when I'm angry. Therefore I'm mad.'
|
|
[Vrh] |
|
krcko Forumaš nagrađen za životno djelo


Pridružen/a: 07. 10. 2002. (15:57:59) Postovi: (18B3)16
|
Postano: 12:26 uto, 13. 4. 2004 Naslov: |
|
|
[quote="defar"]e, sad znam. 4 bajta dakle (akording to some fellow students - adresa tog prvog bajta je jedan integer):)[/quote]
Mislim da su pointeri ekvivalentni unsigned int-ovima, ali nemoj racunati da ce uvijek biti 4 bajta. Koliko memorije zderu ne bi trebalo ovisiti o tome na sto pokazuju, ali moze ovisiti o implementaciji C-a. U svakom slucaju sizeof ti vraca velicinu bilo koje varijable, moze i pointera na neku cudnu strukturu.
defar (napisa): | e, sad znam. 4 bajta dakle (akording to some fellow students - adresa tog prvog bajta je jedan integer) |
Mislim da su pointeri ekvivalentni unsigned int-ovima, ali nemoj racunati da ce uvijek biti 4 bajta. Koliko memorije zderu ne bi trebalo ovisiti o tome na sto pokazuju, ali moze ovisiti o implementaciji C-a. U svakom slucaju sizeof ti vraca velicinu bilo koje varijable, moze i pointera na neku cudnu strukturu.
_________________ Vedran Krcadinac
Ljudi su razliciti, a nula je paran broj.
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 14:05 uto, 13. 4. 2004 Naslov: |
|
|
Velicina pointera ovisi o platformi na kojoj se radi, ali ono sto je sigurno da, ako je T neki tip, onda ce se
[code:1] sizeof(T*) == sizeof(void*);[/code:1]
uvijek evaluirati kao true i.e. 1.
Dakle velicina pontera je konstantna bez obzira na koji tip je to pointer, dok god se ne mijenja platforma.
Sto se tipa struct node tice, da saznas velicinu pointera na taj tip jednostavno koristi:
[code:1]sizeof(struct node*);[/code:1]
Velicina pointera ovisi o platformi na kojoj se radi, ali ono sto je sigurno da, ako je T neki tip, onda ce se
Kod: | sizeof(T*) == sizeof(void*); |
uvijek evaluirati kao true i.e. 1.
Dakle velicina pontera je konstantna bez obzira na koji tip je to pointer, dok god se ne mijenja platforma.
Sto se tipa struct node tice, da saznas velicinu pointera na taj tip jednostavno koristi:
Kod: | sizeof(struct node*); |
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
Matko Forumaš(ica)

Pridružen/a: 15. 06. 2003. (01:56:38) Postovi: (57)16
|
|
[Vrh] |
|
Matko Forumaš(ica)

Pridružen/a: 15. 06. 2003. (01:56:38) Postovi: (57)16
|
Postano: 17:59 uto, 13. 4. 2004 Naslov: |
|
|
[quote="krcko"][quote="defar"]e, sad znam. 4 bajta dakle (akording to some fellow students - adresa tog prvog bajta je jedan integer):)[/quote]
Mislim da su pointeri ekvivalentni unsigned int-ovima, ali nemoj racunati da ce uvijek biti 4 bajta. Koliko memorije zderu ne bi trebalo ovisiti o tome na sto pokazuju, ali moze ovisiti o implementaciji C-a. U svakom slucaju sizeof ti vraca velicinu bilo koje varijable, moze i pointera na neku cudnu strukturu.[/quote]
Afaik, po (ANSI) C standardu ne postoji unaprijed definirana veza izmedju velicina pointerskih tipova i bilo kojeg ugradjenog tipa.
Takodjer, po standardu, sizeof operator definiran je tako da vraca koliko puta je dani tip za kojeg se zeli odrediti velicina veci od ugradjenog tipa char (koji naravno po defaultu uvijek iznosi 1 byte, pa se zato i moze interpretirati da sizeof vraca velicinu u byteovima, no, cisto teoretski, "mjerna jedinica" od sizeof nije byte :) ).
krcko (napisa): | defar (napisa): | e, sad znam. 4 bajta dakle (akording to some fellow students - adresa tog prvog bajta je jedan integer) |
Mislim da su pointeri ekvivalentni unsigned int-ovima, ali nemoj racunati da ce uvijek biti 4 bajta. Koliko memorije zderu ne bi trebalo ovisiti o tome na sto pokazuju, ali moze ovisiti o implementaciji C-a. U svakom slucaju sizeof ti vraca velicinu bilo koje varijable, moze i pointera na neku cudnu strukturu. |
Afaik, po (ANSI) C standardu ne postoji unaprijed definirana veza izmedju velicina pointerskih tipova i bilo kojeg ugradjenog tipa.
Takodjer, po standardu, sizeof operator definiran je tako da vraca koliko puta je dani tip za kojeg se zeli odrediti velicina veci od ugradjenog tipa char (koji naravno po defaultu uvijek iznosi 1 byte, pa se zato i moze interpretirati da sizeof vraca velicinu u byteovima, no, cisto teoretski, "mjerna jedinica" od sizeof nije byte ).
|
|
[Vrh] |
|
Matko Forumaš(ica)

Pridružen/a: 15. 06. 2003. (01:56:38) Postovi: (57)16
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 18:10 uto, 13. 4. 2004 Naslov: |
|
|
[quote="Matko"]
Mnoge ekstenzije C jezika ukljucuju specificnosti pojedinih platformi gdje zbog odredjenih razloga mogu (i trebaju) postojati pointeri razlicitih velicina (npr. near, far, huge i sl.).[/quote]
Istina, ali ako se vode rasprave o C-u, onda se, ako nije bilo drugacije napomenuto, pretpostavlja da ljudi koriste ANSI standard, iako mislim da bi bilo bolje da se pod [i]standard[/i] podrazumjeva C99 standard.
Sto se pointera tice, ako postoje npr. near i far, onda je sasvim dovoljno za pointer koristiti samo far jer je pomocu njih moguce adresirati i ono sto se moze sa near.
Matko (napisa): |
Mnoge ekstenzije C jezika ukljucuju specificnosti pojedinih platformi gdje zbog odredjenih razloga mogu (i trebaju) postojati pointeri razlicitih velicina (npr. near, far, huge i sl.). |
Istina, ali ako se vode rasprave o C-u, onda se, ako nije bilo drugacije napomenuto, pretpostavlja da ljudi koriste ANSI standard, iako mislim da bi bilo bolje da se pod standard podrazumjeva C99 standard.
Sto se pointera tice, ako postoje npr. near i far, onda je sasvim dovoljno za pointer koristiti samo far jer je pomocu njih moguce adresirati i ono sto se moze sa near.
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
Matko Forumaš(ica)

Pridružen/a: 15. 06. 2003. (01:56:38) Postovi: (57)16
|
Postano: 18:30 uto, 13. 4. 2004 Naslov: |
|
|
[quote="mdoko"]
Istina, ali ako se vode rasprave o C-u, onda se, ako nije bilo drugacije napomenuto, pretpostavlja da ljudi koriste ANSI standard, iako mislim da bi bilo bolje da se pod [i]standard[/i] podrazumjeva C99 standard.
[/quote]
Naravno, svjestan sam da je ANSI C defaultni "sluzbeni" jezik, ono sto sam prethodno bio napisao samo sam htio navesti tek toliko kao kuriozitet, da ne bi ispalo kako je sve crno-bijelo. :)
E, sad, da li bi bilo bolje da se C99 uvede kao defaultni standard, o tome bi se vec dalo diskutirati.
Ako nista drugo, mislim da je ipak ANSI C jos uvijek bolje podrzan od strane vecine compilera nego C99.
[quote="mdoko"]
Sto se pointera tice, ako postoje npr. near i far, onda je sasvim dovoljno za pointer koristiti samo far jer je pomocu njih moguce adresirati i ono sto se moze sa near.[/quote]
Not quite... Ovisi o kakvom memorijskom modelu je rijec (neki maleni memorijski modeli uopce niti ne dopustaju far tip pointera).
mdoko (napisa): |
Istina, ali ako se vode rasprave o C-u, onda se, ako nije bilo drugacije napomenuto, pretpostavlja da ljudi koriste ANSI standard, iako mislim da bi bilo bolje da se pod standard podrazumjeva C99 standard.
|
Naravno, svjestan sam da je ANSI C defaultni "sluzbeni" jezik, ono sto sam prethodno bio napisao samo sam htio navesti tek toliko kao kuriozitet, da ne bi ispalo kako je sve crno-bijelo.
E, sad, da li bi bilo bolje da se C99 uvede kao defaultni standard, o tome bi se vec dalo diskutirati.
Ako nista drugo, mislim da je ipak ANSI C jos uvijek bolje podrzan od strane vecine compilera nego C99.
mdoko (napisa): |
Sto se pointera tice, ako postoje npr. near i far, onda je sasvim dovoljno za pointer koristiti samo far jer je pomocu njih moguce adresirati i ono sto se moze sa near. |
Not quite... Ovisi o kakvom memorijskom modelu je rijec (neki maleni memorijski modeli uopce niti ne dopustaju far tip pointera).
|
|
[Vrh] |
|
defar Forumaš(ica)


Pridružen/a: 19. 01. 2004. (01:37:19) Postovi: (152)16
|
Postano: 20:24 uto, 13. 4. 2004 Naslov: |
|
|
[quote="mdoko"]
Istina, ali ako se vode rasprave o C-u, onda se, ako nije bilo drugacije napomenuto, pretpostavlja da ljudi koriste ANSI standard, iako mislim da bi bilo bolje da se pod [i]standard[/i] podrazumjeva C99 standard.
Sto se pointera tice, ako postoje npr. near i far, onda je sasvim dovoljno za pointer koristiti samo far jer je pomocu njih moguce adresirati i ono sto se moze sa near.[/quote]
ok, fala decki :D zadah mu sizeof(node *) <=> sizeof(node_ptr), uz gore zadane oznake, i stvar funkcionira na studentu, s cc-om.
samo, sad ste me zbunili...ovisi o platformi? znaci, ovo near, far...to znaci da negdje ima vise memorije, pa adresa moze eventualno biti broj veci od maxint?
ispricat cete me zbog mog infantilnog izrazavanja, ali zbilja nisam u vasem rangu glede programiranja...
kakve sad to ima veze sa standardom? kao, ANSI dopusta tolko-i-tolko memorije, pa ne moze
alocirat neku "dalju" memoriju? ili je jednostavno definirano da varijabla koja je pointer koristi odredjen komad memorije da se zapise..ali, onda, ako pointer nije nista drugo nego adresa, tj. nekakav int, zasto bi kolicina mem varirala od Ca do Ca? sto je zapisano u toj "razlici mem"? nesto sto upucuje na to da je doticna var pointer? ne...to "cita " kompajler...zato sluze zvijezdice! :oops:
ako shvacate ...ajd molim pojasnjenje :D uh... sad ste me bezveze zainteresirali! :evil:
mdoko (napisa): |
Istina, ali ako se vode rasprave o C-u, onda se, ako nije bilo drugacije napomenuto, pretpostavlja da ljudi koriste ANSI standard, iako mislim da bi bilo bolje da se pod standard podrazumjeva C99 standard.
Sto se pointera tice, ako postoje npr. near i far, onda je sasvim dovoljno za pointer koristiti samo far jer je pomocu njih moguce adresirati i ono sto se moze sa near. |
ok, fala decki zadah mu sizeof(node *) ⇔ sizeof(node_ptr), uz gore zadane oznake, i stvar funkcionira na studentu, s cc-om.
samo, sad ste me zbunili...ovisi o platformi? znaci, ovo near, far...to znaci da negdje ima vise memorije, pa adresa moze eventualno biti broj veci od maxint?
ispricat cete me zbog mog infantilnog izrazavanja, ali zbilja nisam u vasem rangu glede programiranja...
kakve sad to ima veze sa standardom? kao, ANSI dopusta tolko-i-tolko memorije, pa ne moze
alocirat neku "dalju" memoriju? ili je jednostavno definirano da varijabla koja je pointer koristi odredjen komad memorije da se zapise..ali, onda, ako pointer nije nista drugo nego adresa, tj. nekakav int, zasto bi kolicina mem varirala od Ca do Ca? sto je zapisano u toj "razlici mem"? nesto sto upucuje na to da je doticna var pointer? ne...to "cita " kompajler...zato sluze zvijezdice!
ako shvacate ...ajd molim pojasnjenje uh... sad ste me bezveze zainteresirali!
_________________ `To begin with, a dog's not mad. You grant that? 'Well, then,' the Cat went on, `you see, a dog growls when it's angry, and wags its tail when it's pleased. Now I growl when I'm pleased, and wag my tail when I'm angry. Therefore I'm mad.'
|
|
[Vrh] |
|
mdoko Forumaš(ica)


Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol: 
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 18:17 ned, 18. 4. 2004 Naslov: |
|
|
[quote="defar"]
kao, ANSI dopusta tolko-i-tolko memorije, pa ne moze
alocirat neku "dalju" memoriju? ili je jednostavno definirano da varijabla koja je pointer koristi odredjen komad memorije da se zapise..ali, onda, ako pointer nije nista drugo nego adresa, tj. nekakav int, zasto bi kolicina mem varirala od Ca do Ca?
[/quote]
Nije stvar u tome sto ANSI dopusta, jer ne moze standard koji govori o jeziku ogranicavati memoriju (osim ako je rijec o pascalu ili jos necemu s takvim idejama), nego se radi o tome da ako imas vise memorije potrebna ti je veca kolicina bitova da adresiras svaki byte, tako da se onda koriste near pointeri da bi se adresirale 'blize' adrese, a far one 'dalje'. Npr. ako su ti dovoljna 32 bita da adresiras citavu memoriju, onda ce ti pointer imati velicinu od 4B (1B=8b), ali je moguce uvesti i near pointere za adresiranje onih djelova memorije koji su adresirani tako da na vodeca dva bytea imaju 0, takoda ce ti velicina near pointera biti 2B, jer umjesto 0x00003A00 dovoljno ti je pisati 0x3A00.
Sada da se vratimo na standard. Ono sto ANSI zahtjeva je da u C jeziku velicina pointera uvijek bude konstantna tj. onoliko kolkio je potrebno da se moze alocirati citav memorijski prostor koji je raspoloziv programu koji se izvodi na odredjenoj hardverskoj platformi.
defar (napisa): |
kao, ANSI dopusta tolko-i-tolko memorije, pa ne moze
alocirat neku "dalju" memoriju? ili je jednostavno definirano da varijabla koja je pointer koristi odredjen komad memorije da se zapise..ali, onda, ako pointer nije nista drugo nego adresa, tj. nekakav int, zasto bi kolicina mem varirala od Ca do Ca?
|
Nije stvar u tome sto ANSI dopusta, jer ne moze standard koji govori o jeziku ogranicavati memoriju (osim ako je rijec o pascalu ili jos necemu s takvim idejama), nego se radi o tome da ako imas vise memorije potrebna ti je veca kolicina bitova da adresiras svaki byte, tako da se onda koriste near pointeri da bi se adresirale 'blize' adrese, a far one 'dalje'. Npr. ako su ti dovoljna 32 bita da adresiras citavu memoriju, onda ce ti pointer imati velicinu od 4B (1B=8b), ali je moguce uvesti i near pointere za adresiranje onih djelova memorije koji su adresirani tako da na vodeca dva bytea imaju 0, takoda ce ti velicina near pointera biti 2B, jer umjesto 0x00003A00 dovoljno ti je pisati 0x3A00.
Sada da se vratimo na standard. Ono sto ANSI zahtjeva je da u C jeziku velicina pointera uvijek bude konstantna tj. onoliko kolkio je potrebno da se moze alocirati citav memorijski prostor koji je raspoloziv programu koji se izvodi na odredjenoj hardverskoj platformi.
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
|