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/


Raspunde prin e-mail lui