[ Jordan90 @ 08.02.2012. 15:34 ] @
Evo da pitam za neke(meni nejasne) funkcije u C....

Funkcijamalloc .... ja na samom pocetku definisem text = malloc(sizeof(char)*15) i ubacim neki string od 10 znakova i to je ok (jer sam odredio da moze 15 charova) ,a kad promenim
text = malloc(sizeof(char)*5) opet normalno ispisuje string od 10 znakova.... U cemu je onda poenta ako se nista nije izmenilo?? kako uopste funkcionise malloc()? I gde da proverim velicinu programa?

funkcijamemmove... Nije mi jasno kako radi,tj kako siftuje i pomera znakove u stringu?

Hvala
[ Mihajlo Cvetanović @ 08.02.2012. 16:01 ] @
malloc vraća pointer na bafer koji se dalje može koristiti, i na kraju rada mora osloboditi sa free. Kad se malloc pozove drugi put onda vraća pointer na drugi bafer. Veličina bafera je data u parametru funkcije. Ako program piše nešto izvan ovog bafera onda se stručno rečeno desi nedefinisano ponašanje (undefined behavior). Nedefinisano ponašanje ne znači da će program javiti grešku, niti da će prestati sa radom. Nedefinisano ponašanje može da znači da nikad nećeš videti ni osetiti grešku, ali to ti prosto nije zagarantovano. Ako imaš sreće desiće se nešto dramatično, i to odmah pošto se desilo nedefinisano ponašanje. Ako nemaš sreće neće se desiti ništa tokom razvoja i testiranja programa kod tebe, ali kod kupca program će se čudno ponašati i proizvoditi misteriozne probleme u radu. To je najgore, a ništa ti ne garantuje da će se nedefinisano ponašanje manifestovati isto na različitim računarima, okruženjima, pa čak i na istom računaru u različito doba dana.

memmove kopira bajtove od nazad, ako utvrdi da je to potrebno.
[ Jordan90 @ 09.02.2012. 15:18 ] @
Za malloc mi je jasno,samo u kojim slucajevima se ona koristi?Jel pri svakom stringu ili ima nesto odredjeno,npr da se definise na pocetku i onda da se na kraju samo oslobodi ili alocira?

A za memmove,mi bas i nije najjasnije,guglao sam ali i dalje ne kapiram. Npr imam neki string " Hello world ",a hocu da dobijem string bez tih space-ova na pocetku i na kraju,tj "Hello world",kako bi u tom slucaju glasila memmove()? Inace sam zakljucio da ovo moze biti vrlo korisna i primenjiva funkcija ako znas da je iskoristis :)

[ Mihajlo Cvetanović @ 09.02.2012. 15:53 ] @
I malloc i memmove se koriste onda kad ti trebaju. Ne postoji nikakav zakon koji kaže da se malloc koristi samo na nekom mestu, u neko vreme. Kad ti treba novi bafer pozovi malloc. I ne zaboravi da sa free oslobodiš memoriju koji si dobio uz pomoć malloca.

Nemam običaj da memmove koristim za stringove, ali u ovom slučaju to bi izgledalo nekako ovako:

Code:
char hello[] = " Hello world ";
memmove(hello, hello + 1, 11);
hello[11] = '\0';


Efekat poziva memmove ovde je da se niz od 11 znakova "Hello world" (bez nul terminatora) iskopira na početak bafera hello i tako prebriše prvi spejs. Bafer hello koji je veličine 14 znakova (11 + 2 spejsa + nul terminator) posle operacije memmove izgleda ovako "Hello worldd <nul>" (ovde sam sa <nul> označio da bafer sadrži nul terminator na kraju). Ono drugo "d" je ostalo od ranije. Kad se u sledećem koraku postavi i nul terminator tamo gde treba bafer hello izgleda ovako "Hello world<nul> <nul>". Prilikom rada sa stringovima gleda se sadržaj samo do prvog nul terminatora, pa kad se ovaj bafer ispiše na ekranu vidi se samo "Hello world".