PDA

Pogčedajte punu verziju : C - Alokacija memorije


orangem
19. 01. 2009., 12:09
Pozdrav svima!
Imam problem sa alokacijom memorije unutar strukture:

typedef struct
{
char *usrname;
int int_usr_id;
} user_data;

...

user_data *user_data_arr;

user_data_arr = (user_data*)malloc(sizeof(user_data) * 10);

...

Uzimamo podatke iz baze, 10 redova

...

user_data_arr[i].usrname = (char *)malloc(sizeof(mysql_row[0]));
if (user_data_arr[i].usrname != NULL)
{
sprintf(user_data_arr[i].usrname,"%s",mysql_row[0]);
}
...

Kada izvrsim ovaj kod dobijem:
*** glibc detected *** malloc(): memory corruption: 0x0806c250 ***

Ako koristim staticki niz, npr. usrname[50] onda sve radi ok.

Peca
19. 01. 2009., 12:29
mislim da sizeof(mysql_row[0]) ne vraca duzinu podatka koji mysql daje...
tu se mozda zeznes.

orangem
19. 01. 2009., 12:39
Jeste, u pravu si!

(char *) malloc(sizeof(char *)*strlen(mysql_row[0]));

Sada radi...

Hvala!

Peca
19. 01. 2009., 13:01
znaci nisam zardjao, iako nisam programirao u C/C++ vec punih 5-6 god... ;)
sta ucini web development od mene...

btw, zasto opet sizeof koristis?
zar ne treba:
(char *) malloc(strlen(mysql_row[0]));

srdjan
19. 01. 2009., 13:22
malloc ( strlen (s) + 1 ) !

Kakav flashback u nocne more devedesetih :)

Peca
19. 01. 2009., 13:55
da... +1 :)
ipak se vidi da sam zaboravio sitnice...
a flashback jeste... nekad smo svi kuburili sa tim... ovi web jezici nas navikli sve na gotovo :)

orangem
19. 01. 2009., 14:07
sizeof koristim da program bude nezavisan od masine na kojoj se izvrsava.

bNasty
19. 01. 2009., 15:35
^ sizeof(char) je uvek 1 bajt. Standard tako kazhe. Osim ako ne ulazish u rasprave tipa shta je "bajt" (ili prevodish taj kod na nekom DSP-u ili mainframe-ovima)

Dragi Tata
19. 01. 2009., 16:17
^ sizeof(char) je uvek 1 bajt. Standard tako kazhe. Osim ako ne ulazish u rasprave tipa shta je "bajt" (ili prevodish taj kod na nekom DSP-u ili mainframe-ovima)

Ne vidim razlog za "osim". Sa stanovišta malloc-a, char je uvek 1 bajt i nema razloga za sizeof.

bNasty
19. 01. 2009., 16:33
^ U kontekstu malloc-a da.

Poenta (nepotrebnog) "osim" su arhitekture sa chudnom oranizacijom memorije, ili nestandardni kompajleri.

Peca
19. 01. 2009., 16:55
ali on koristi sizeof(char *) pa to mnozi sa brojem karaktera.
kapirate?
to je apsurd na koji ukazujem...

srdjan
19. 01. 2009., 17:58
sizeof (char *) == 4 (na 32bit)


(zato mu i radi bez +1) :)