2012-10-24 12 views
7

C'è qualche rischio quando si usano i char * per scrivere il codice cross platform che accede alla memoria?Eventuali insidie ​​che utilizzano char * invece di void * durante la scrittura di codice multipiattaforma?

AGGIORNAMENTO: Ad esempio, dovrei controllare prima di trasmettere un char delegato ad un determinato tipo (ad esempio un int) se l'indirizzo è allineato alle dimensioni di quel tipo? Alcune architetture restituiranno strani risultati sull'accesso non allineato?

Sto lavorando a un allocatore di memoria di gioco per capire meglio come eseguire il debug dei problemi di memmory. Sono arrivato a credere che i char * siano preferibili a causa della capacità di fare aritmetica puntatore e dereferenziarli per il vuoto *, è vero? Le seguenti ipotesi si mantengono sempre vere su diverse piattaforme comuni?

sizeof(char) == 1 
sizeof(char*) == sizeof(void*) 
sizeof(char*) == sizeof(size_t) 
+0

A meno che non si stia definendo le istanze di 'char', è necessario eseguire il cast sia di' char * 'che di' void * 'per qualsiasi tipo puntino. – Aesthete

+0

Non so se è "garantito" ma nella mia esperienza i primi 2 dovrebbero essere sicuri. L'ultimo...??. – vdbuilder

risposta

5

sizeof(char)==1 è sicuramente sempre vero.

sizeof(char *) == sizeof(void *) è probabilmente sempre vero. Lo standard C richiede che abbiano la stessa rappresentazione, che almeno implica fortemente la stessa dimensione.

sizeof(char *) == sizeof(size_t) sicuramente non si può dipendere da - so di implementazioni per le quali è falso (e anche se probabilmente non si adattano perfettamente allo standard, questo non è uno dei loro problemi).

+1

Grazie Jerry. Conosci un tipo che ha sempre le stesse dimensioni della dimensione del puntatore (diverso dal tipo di puntatore :))? Ad esempio dovrebbe essere 32 bit su un build a 32 bit e 64 su un build a 64 bit. Ero sotto l'impressione che size_t era un tipo simile. – UberMongoose

+1

@UberMongoose: in primo luogo, si noti che non è nemmeno richiesto che tutti i puntatori abbiano la stessa dimensione. Di solito lo saranno, ma non è richiesto. Nella maggior parte dei casi tipici, 'size_t' sarà lo stesso, ma di nuovo, non garantito (e so almeno un paio di eccezioni). MS (per un esempio) definisce alcuni tipi come INT_PTR (un intero della stessa dimensione di un puntatore), ma è tutt'altro che universale. Probabilmente il meglio che puoi fare è usare un typedef in un'intestazione di configurazione, così puoi modificarlo se arrivi a una piattaforma dove è necessario. –

+2

intptr_t? "Il seguente tipo designa un tipo intero con segno con la proprietà che qualsiasi puntatore valido a void può essere convertito in questo tipo, quindi convertito di nuovo in puntatore a void, e il risultato sarà uguale al puntatore originale" – rici

Problemi correlati