Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    44

    Aritmetica dei puntatori

    Ciao!! Sto realizzando un programma in C che consiste in un allocatore di memoria. La specifica mi richiede di allocare inizialmente un blocco di memoria di n byte e poi fornire delle funzioni che permettano di allocare e disallocare blocchi di dimensione indicata in questa area di memoria.
    Per la gestione dell'area di memoria ho creato una lista che descrive le partizioni occupate. Per ogni partizione memorizzo il puntatore al primo byte della partizione (di tipo void *) e la lunghezza della partizione (di tipo int).
    Quando mi viene richiesta una nuova allocazione devo consultare la lista per cercare uno spazio sufficiente. Per far ciò devo sommare, per ogni partizione, il puntatore al primo byte e la sua lunghezza e infine sottrarre tale somma al puntatore della partizione successiva per ottenere la lunghezza della partizione libera che sta nel mezzo.
    Praticamente io vorrei sommare ad un void* un int e poi sottarre ad un void* il risultato di tale somma.
    Questa operazione non mi da il risultato che mi apetto, cosa e' che sbaglio? Potreste darmi delucidazioni sull'aritmetica dei puntatori?

    Grazie mille

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Dato che l'allocazione della memoria da parte del tuo programma lavora con una quantita' di "byte", quando fai le operazioni con i puntatori, gestiscili come puntatori a char ...

    Se mostri il codice con cui fai le varie operazioni, si puo' essere piu' chiari ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    memorizzo il puntatore al primo byte della partizione (di tipo void *)
    Io definirei un tipo byte come
    codice:
    typedef unsigned char    byte;
    , e quindi memorizzerei il primo puntatore come byte *; in questa maniera eviti ogni problema con i void * e puoi usare tranquillamente l'aritmetica dei puntatori. Inoltre è subito chiaro dalla lettura del codice che ti stai riferendo a dei non meglio definiti byte e non ad un tipo di dati particolare.
    e la lunghezza della partizione (di tipo int).
    Per questo genere di cose si usa il tipo size_t (leggi qui per sapere perché).
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2008
    Messaggi
    44
    Grazie dei suggerimenti, ho cercato di metterli in pratica. La struttura che uso per descrivere la partizione occupata è questa:

    codice:
    /** Elemento della lista delle partizioni libere */
    typedef struct elMap_t {
    	/** Puntatore all'inizio della partizione */
    	byte *start;
    	/** Dimensione della partizione */
    	size_t size;
     	/** Puntatore al precedente elemento della lista */
    	struct elMap_t *prev;
    	/** Puntatore al prossimo elemento della lista */
    	struct elMap_t *next;
    } elMap;
    per sapere l'indirizzo dell'ultimo byte della partizione posso fare:

    codice:
    m->start + m->size
    giusto?

    e per sapere se ci sono byte liberi tra questa partizione e la successiva posso fare:

    codice:
    m->next->start - (m->start + m->size)
    giusto?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Originariamente inviato da kill9
    per sapere l'indirizzo dell'ultimo byte della partizione posso fare:

    codice:
    m->start + m->size
    giusto?
    No ... devi scrivere

    m->start + m->size - 1

    e per sapere se ci sono byte liberi tra questa partizione e la successiva posso fare:

    codice:
    m->next->start - (m->start + m->size)
    giusto?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.