Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Globalna 'char *promenljiva[5]' zeza!

[es] :: C/C++ programiranje :: Globalna 'char *promenljiva[5]' zeza!

Strane: 1 2

[ Pregleda: 6884 | Odgovora: 34 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.rcub.bg.ac.yu

Sajt: www.mycity.rs


+1 Profil

icon Globalna 'char *promenljiva[5]' zeza!01.04.2002. u 19:49 - pre 249 meseci
int main(void) {
char *a[5];
strcpy (a[0], "aaaaaaaa");
printf("%s\n", a[0]);
return 1;
}

Ovo radi perfektno!
Ali, ako char *a[5]; stavim kao globalnu promenljivu - program puca!
Nije do kompajlera, i u vc++ isto puca...
...a lepo se iskompajlira?
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.vwr.wanadoo.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!01.04.2002. u 20:05 - pre 249 meseci
Citat:
zastita:
Ovo radi perfektno!


Program ti je neispravan.

char *a[5]

je, kao sto zna svako dete koje je procitalo neku knjigu o C-u, niz od 5 pointera na char od kojih svaki moze da pokazuje na neki string.

Ti medjutim ne alociras memoriju ni za jedan od tih 5 pointera, a sa strcpy kopiras string u memoriju na koju pokazuje a[0]. Kada je a lokalna promenljiva, prema standardu, pointeri uzimaju vrednosti jednake onome sto se zateklo na steku u to vreme, tako da pokazuju na proizvoljne lokacije.

Kada je a globalna promenljiva, svi pointeri iz niza a su inicijalizovani na NULL tako da strcpy puca uz SIGSEGV (Segmentation Fault). U slucaju kada je a na steku, samo si se slucajno izvukao bez greske i program ti naizgled radi.

Da bi program ispravno radio, moraces da alociras memoriju za a[0]:

Code:

a[0] = (char *) malloc( strlen( taj_string_sto_upisujes) + 1);
strcpy( a[0], taj_string_sto_upisujes);


poz.
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.rcub.bg.ac.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!01.04.2002. u 20:10 - pre 249 meseci
Hvala
 
Odgovor na temu

anatogen
Novi Beograd

Član broj: 1294
Poruke: 150
*.ppp-bg.sezampro.yu



Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!02.04.2002. u 01:38 - pre 249 meseci
Citat:
filmil:

U slucaju kada je a na steku, samo si se slucajno izvukao bez greske i program ti naizgled radi.



Mrzi me da probam ali posto pointer a[0] "dobija" proizvoljnu vrednost sa steka (tj. sta god je bilo na steku u to vreme kada je odvojen prostor za njega) zar je moguce da je ta vrednost bas neka adresa u dozvoljenom opsegu virt. adresa, odnosno zar ne bi skoro svaki put takav program popio SIGSEGV....

vitamini, minerali, suplementi...
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
199.171.112.*



+6 Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!02.04.2002. u 01:40 - pre 249 meseci
I ne zaboravi na

free (a[0]);

kad završiš sa tim stringom.
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!02.04.2002. u 09:32 - pre 249 meseci
Citat:
anatogen:
dozvoljenom opsegu virt. adresa, odnosno zar ne bi skoro svaki put takav program popio SIGSEGV....


Ne znam zbog čega se provuče. Ako te ne mrzi da probaš, odvrti jednu sesiju sa GDB-om, stvari će valjda postati jasnije.

Dovoljno je recimo da pointer pokazuje negde na stek, u kom slučaju ga nikada nećeš uhvatiti ni za glavu ni za rep. Ali će zato, posle nekog vremena procedure koje si pozvao početi da se vraćaju na nepostojeće adrese.

poz.
 
Odgovor na temu

Reljam
Relja Markovic
San Francisco

Član broj: 531
Poruke: 1793
*.dialup.mindspring.com



+18 Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!02.04.2002. u 10:00 - pre 249 meseci
Citat:
Filmil:
Code:

a[0] = (char *) malloc( strlen( taj_string_sto_upisujes) + 1);
strcpy( a[0], taj_string_sto_upisujes);



je isto sto i

Code:

a[0] = strdup(taj_string_sto_upisujes);


I isto sledi free posle.
Mislim da je ova druga varijanta laksa-na-oci ;)
 
Odgovor na temu

Predrag Damnjanovic
Predrag Damnjanovic
Nis, Srbija

Član broj: 141
Poruke: 1305
*.rcub.bg.ac.yu

Sajt: www.mycity.rs


+1 Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!02.04.2002. u 12:27 - pre 249 meseci
A sto se tice knjige, citao sam , al' pre 2 godine, i to sam uglavnom sintaksu gledao...
Posle sam neke tutorijale gledao, i to je sve.
Zato se ovoliko bulim sa C-om...
A ako vam merak da me zafrkavate, slobodno, ne ljutim se , jer stvarno ne znam mnogo C.
Ja sam do sada programirao u delphiju, a tamo nema ovakvih zajebancija sa float-ima i char-evima, tamo je sve 'easy to use', kao i ceo Windows
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!02.04.2002. u 14:01 - pre 249 meseci
Citat:
zastita:
A ako vam merak da me zafrkavate, slobodno, ne ljutim se :), jer stvarno


Mislim da bi trebalo da zna da je skoro svako tvoje pitanje kao izvueno iz C FAQ-a. Hou da kaem, zbog toga izgleda kao da ovde pokuava da uradi jednu od sledee dve stvari:

1. Mrzi te da proita FAQ i vidi kako su ljudi reavali probleme koji te mue, pa ak i neke na koje tek treba da naleti.

ili

2. Proitao si C FAQ a dovoljno si zaludan da ide po stavkama i postavlja ih kao pitanja na forumu.

Dakle, vrlo lako moe da se zakljui da zafrkava narod po forumu pa se ne bih iznenadio da ti na tako neto ljudi uzvrate zafrkancijom.

A to se knjige tie, bez obzira da li si itao ili ne, ako ve misli da naui C i bude produktivan programer, uzmi kupi neku dobru C knjiicu. Znam da nije lako prvo pronai stvarno dobru knjigu a potom je i platiti jer jebiga kriza je i sve to, ali to je zaista jedini nain.

Ako dozvoljava da ti preporuim odlinu i jeftinu knjigu za uenje C-a onda je to knjiga Lasla Krausa, "Programski jezik C sa reenim zadacima" u izdanju Elektrotehnikog fakulteta u Beogradu koja se moe kupiti u skriptarnici ETF-a (izdaju je i neki poznati izdavai ali njih neu ovde da reklamiram :) ).

Znam da e neko odmah da mi skoi za vrat ali jo uvek sam ubeen da je po odnosu cena/performanse ovo knjiga koja stoji rame uz rame sa K&R-om kog nije ba jednostavno pronai u YU.

f.

 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16290
*.verat.net



+7108 Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!02.04.2002. u 14:11 - pre 249 meseci
Zastita,

osim obaveznog cesljanja C-FAQ-a i neke dobre C knjige, savetujem ti da koristis i neki tool za nalazenje gresaka.

Na primer, ja sa Visual C++ koristim NuMega BoundsChecker - veruj mi, ako budes radio nesto glomaznije, greske se obavezno ponekad jave - bez obzira koliko si vest. A ovakve alatkice ti lepo kazu sta si propustio da uradis.

Naravno, ovakve alatke ti nece pomoci da otkrijes greske u algoritmu koji planiras da uradis, ali za ove greske sa alokacijom, pointerima, itd.. su dusu dale :)

A K&R mozes da nadjes u skriptarnici PMF-a, za nekih 100 din :)

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

anatogen
Novi Beograd

Član broj: 1294
Poruke: 150
*.ppp-bg.sezampro.yu



Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!03.04.2002. u 01:08 - pre 249 meseci
Citat:
filmil:
Ako dozvoljavaš da ti preporučim odličnu i jeftinu knjigu za učenje C-a onda je to knjiga Lasla Krausa, "Programski jezik C sa rešenim zadacima" u izdanju Elektrotehničkog fakulteta u Beogradu koja se može kupiti u skriptarnici ETF-a (izdaju je i neki poznati izdavači ali njih neću ovde da reklamiram :) ).

Znam da će neko odmah da mi skoči za vrat ali još uvek sam ubeđen da je po odnosu cena/performanse ovo knjiga koja stoji rame uz rame sa K kog nije baš jednostavno pronaći u YU.



Procitao sam obe te knjige i naravno izuzetno su korisne, pogotovo K&R :) ali i ako sam teski pocetnik mislim da znati C dobro podrazumeva mnogo vise od toga...

Na primer: poznavalje arhitekture racunara uopste (kako to sve radi) pa onda kernel i u sve vezi njega (pogotovo mm) pa kako izgleda taj nas C kod u asembleru (gde su koje promenjive sta je stack frame npr.) pa kako radi linkovanje staticko i dinamicko itd...



vitamini, minerali, suplementi...
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16290
*.verat.net



+7108 Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!03.04.2002. u 01:24 - pre 249 meseci
To se uci na "Osnovama Programiranja" - Racunarstvo i Informatika, smer na PMF-u - ima knjiga po nasim knjizarama koje su udzbenici za ovo, gde se bas pocinje od arhitekture, preko osnova o programskim jezicima, informacija o kompajlerima, iterpretatorima.. pa onda tipovima podataka, strukturama...

osnovnim algoritimima... itd..

Ja se secam da sam u to vreme, za ispit uzeo "Programski Jezik PASCAL" od Tosica, samo zato sto je tu lepo objasnjeno bas to gore - kako taj isti profesor voli :)) Nema veze sto je PASCAL bio u pitanju, posto sam ja radio u C-u, principi su manje-vise isti - samo je sintaksa drugacija. Osnove su zajednicke.

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

masetrt
Marko Djurovic
Programer, Omni-Explorer
Beograd

Član broj: 3129
Poruke: 228
*.ptt.yu

Sajt: www.vast.com


+2 Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!04.04.2002. u 13:41 - pre 249 meseci
Ljudi zaboravite na malloc ,realloc i free od pojave c++ se koristi new i delete
tako da bi izgledalo:
char *str;
str=new char[5];
.
.
.
delete []str;
Dinamicki nizovi su bolji i imaju nekoliko nacina pristupa, new i delete su stabilniji (pogledaj bilo koju profi statistiku) od malloc i free
His majesty Grand Duke of Shumadija and Western Pomoravlje
 
Odgovor na temu

Ivan Dimkovic

Administrator
Član broj: 13
Poruke: 16290
*.verat.net



+7108 Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!04.04.2002. u 13:57 - pre 249 meseci
Nisam te bas najbolje razumeo:

Citat:

Dinamicki nizovi su bolji i imaju nekoliko nacina pristupa, new i delete su stabilniji (pogledaj bilo koju profi statistiku) od malloc i free


U kom smislu stabilniji?

Mislis da je kod u kome se koriste new/delete umesto malloc/free statisticki stabilniji?

Ili mislis da su implementacije new/delete u kompajlerima stabilnije od malloc/free?

Ja ne vidim neku veliku razliku. Ja new/delete koristim za klase, a malloc/free za memorijske bafere, nizove, itd... Niko ti ne brani da koristis malloc/free u C++ kodu, tamo gde je to moguce.

DigiCortex (ex. SpikeFun) - Cortical Neural Network Simulator:
http://www.digicortex.net/node/1 Videos: http://www.digicortex.net/node/17 Gallery: http://www.digicortex.net/node/25
PowerMonkey - Redyce CPU Power Waste and gain performance! - https://github.com/psyq321/PowerMonkey
 
Odgovor na temu

Jovan Marjanovic
HP GmbH
Stuttgart

Član broj: 942
Poruke: 456
*.net.external.hp.com

ICQ: 42
Sajt: www.hp.com


Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!04.04.2002. u 13:58 - pre 249 meseci
zasto bi uopste deklarisao a kao *a[5]

lepo deklarises kao **a i zavrsis posao. onda alociras koliko ti treba svega.
Isto tako mozes da napravis nesto ovako :

Code:

#define StrLenA(str)(strlen(str)+1)

char * StrNCopy(constant char  * str)
{
size_t duzina;
char *novistring;

if (str == NULL) str = "";
duzina = StrLenA(str);
novistring = malloc(duzina);
memcpy(novistring, str, duzina);

return novistring;
}

for (x=0;x<nesto;x++)
*a[x] = StrNCpy("nekistring");



mwahaha, morao sam malo da se izivljavam :
Za automatsko dobijanje Super Moderatorskog statusa na Elitesecurity forumima pritisnite Alt+F4
 
Odgovor na temu

Jovan Marjanovic
HP GmbH
Stuttgart

Član broj: 942
Poruke: 456
*.net.external.hp.com

ICQ: 42
Sajt: www.hp.com


Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!04.04.2002. u 14:01 - pre 249 meseci
naravno, kad zavrsis sa tom promenljivom moras da napravis free na sve elemente arraya, i da sve lepo pocistis iza sebe, ali u principu nije problem.

jos jedno pitanje, zasto bi ikada deklarisao bilo sta globalno ?

Za automatsko dobijanje Super Moderatorskog statusa na Elitesecurity forumima pritisnite Alt+F4
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!04.04.2002. u 14:26 - pre 249 meseci
Citat:
Reljam:
je isto sto i
Code:

a[0] = strdup(taj_string_sto_upisujes);

Mislim da je ova druga varijanta laksa-na-oci ;)


Ovo je do sada najbolji i najjednostavniji savet. Tata, postavi ovo u FAQ ako te ne mrzi.

poz.
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!04.04.2002. u 14:27 - pre 249 meseci
Citat:
blue:
mwahaha, morao sam malo da se izivljavam :


Iskreno se nadam da nisi bio ozbiljan kad si kucao ovo gore. :)

poz.
 
Odgovor na temu

filmil
Filip Miletić
Oce Technologies B.V., inženjer
hardvera
Arcen, NL

Član broj: 243
Poruke: 2114
*.et.tudelft.nl

Jabber: filmil@jabber.org
ICQ: 36601391


+3 Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!04.04.2002. u 14:34 - pre 249 meseci
Citat:
blue:
jos jedno pitanje, zasto bi ikada deklarisao bilo sta globalno ?


Evo jedan odgovor iz prve ruke :)

C radi na svakojakom hardveru. Ako pišeš program recimo za mikrokontroler 8031, moraćeš da deklarišeš kao globalne promenljive memorijski mapirane periferijske registre. Pristup preko pointera ne ide zato što pointeri pokazuju na drugi 'memory space' (kod PC-ja, recimo, takva razlika ne postoji) pa se ne generišu neophodni signali za pristup eksternoj memoriji i tako dalje i tako bliže.

Naravno možeš da registre proglasiš za static ali onda moraš sve funkcije koje im pristupaju da potrpaš u isti modul a to opet malo zapetljava stvar.

Kod programa za PC-je si u pravu. Nema potrebe da se bilo šta globalizuje.

poz.
 
Odgovor na temu

Jovan Marjanovic
HP GmbH
Stuttgart

Član broj: 942
Poruke: 456
*.net.external.hp.com

ICQ: 42
Sajt: www.hp.com


Profil

icon Re: Globalna 'char *promenljiva[5]' zeza!04.04.2002. u 14:52 - pre 249 meseci
Citat:
filmil:

Kod programa za PC-je si u pravu. Nema potrebe da se bilo šta globalizuje.

poz.



PC, UNIX, stagod. Nikad nisam pominjao mikrokontrolere, i moram da kazem da nikada nisam pisao nista slicno. niti sam imao prilike da pisem firmwere.

sto se tice gore navedenog primera, to je samo parcence implementacije unicode-a koju sam nekada davno pisao za unix. funkcija koju sam napisao je nullsafe, i ponekad threadsafe :)

Za automatsko dobijanje Super Moderatorskog statusa na Elitesecurity forumima pritisnite Alt+F4
 
Odgovor na temu

[es] :: C/C++ programiranje :: Globalna 'char *promenljiva[5]' zeza!

Strane: 1 2

[ Pregleda: 6884 | Odgovora: 34 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.