On Thu, 2003-01-16 at 14:02, Alex Ruse wrote:
> Vrei sa afli numarul de elemente al unui array (tratandu-l ca pe un pointer), nu?
>
> int *p = (int*)malloc(100*sizeof(int));
> nr_elem = (sizeof p / sizeof *p); // imparti marimea totala la marimea
> // primului element
> allocated_size = nr_elem * sizeof(p);
nu tine. dupa cum mai observa cineva, sizeof(p)/sizeof(*p) iti va
returna sizeof(void*)/sizeof(int) intotdeauna.
deoarece implementarile functiilor de gestiune a memoriei variaza f mult
de la un so la altul (poate chiar de la vers de libc la alta) cea mai
eleganta solutie portabila se bazeaza pe wrapper-e in care faci trick-ul
din malloc: aloci ceva mai mult decat se cere, iti salvezi informatia
despre dimensiune la inceput si intorci un pointer dupa.
ceva de genul:
void *my_malloc(size_t sz){
void *res;
if((res = malloc(sz + sizeof(size_t)))){
*(size_t*)res = sz;
return (char*)res + sizeof(size_t);
}
return NULL;
}
void my_free(void *ptr){
free((char*)ptr - sizeof(size_t));
}
size_t get_allocated_size(void *ptr){
return *(size_t*)((char*)ptr - sizeof(size_t));
}
...
--
Florin Malita web: http://www.malinux.net
public key: http://www.malinux.net/data/fmalita.gpg
-- Attached file included as plaintext by Listar --
-- File: signature.asc
-- Desc: This is a digitally signed message part
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.7 (GNU/Linux)
iD8DBQA+Jxom9npXhj/Ohf8RAoSsAJ0XQ1/I99fQOoIIzeYoZC4Tq1SwzwCbB74V
A69JV0ChG739lakXus2EmeI=
=Zbba
-----END PGP SIGNATURE-----
---
Pentru dezabonare, trimiteti mail la
[EMAIL PROTECTED] cu subiectul 'unsubscribe rlug'.
REGULI, arhive si alte informatii: http://www.lug.ro/mlist/