2012-03-18 11 views
16

Come si ottiene la dimensione di un puntatore in C utilizzando sizeof? Voglio malloc un pò di memoria per memorizzare un puntatore (non il valore puntato).Ottieni la dimensione del puntatore in C

+5

AFAIK, puntatori a tipi diversi non sono garantiti per avere la stessa dimensione. – SLaks

+0

Davvero? Puoi fornire un esempio/fonte? Ho sempre pensato che tutti i puntatori abbiano le stesse dimensioni perché si riferiscono tutti a posizioni di memoria all'interno dello stesso spazio di indirizzi. – Matt

+4

@Matt: un controesempio banale è un puntatore a funzione; non è necessariamente lo stesso spazio degli indirizzi. Vedi anche: http://stackoverflow.com/questions/916051/are-there-are-any-platforms-where-pointers-to-different-types-have-different-siz. –

risposta

27

Dato un tipo arbitrario (ho scelto char qui, ma che è per fare un esempio concreto):

char *p; 

È possibile utilizzare uno di queste espressioni:

sizeof(p) 
sizeof(char *) 

portando ad una malloc() cal l quali:

char **ppc = malloc(sizeof(char *)); 
char **ppc = malloc(sizeof(p)); 
char **ppc = malloc(sizeof(*ppc)); 

L'ultima versione ha alcuni vantaggi in quanto se il tipo di ppc modifiche, l'espressione alloca ancora spazio corretto.

+4

Parentesi opzionali nella prima espressione. –

+3

@CarlNorum Vero, ma trovo che chiariscano un po 'l'espressione. È una questione di stile e non qualcosa che dovrebbe essere modificato. –

+2

+1 per identificare che è preferibile l'ultima versione. –

11

Questo dovrebbe fare il trucco:

sizeof(void*) 
1
char *ptr; 
char **ptr2 = malloc(sizeof(ptr)); 

dovrebbe essere in grado di raggiungere il vostro scopo. Non importa quale sia la piattaforma, questo codice dovrebbe funzionare.

Problemi correlati