2012-03-18 24 views
16

¿Cómo obtengo el tamaño de un puntero en C usando sizeof? Quiero malloc algo de memoria para almacenar un puntero (no el valor que se apunta).Obtener el tamaño del puntero en C

+5

AFAIK, no se garantiza que el puntero a diferentes tipos tenga el mismo tamaño. – SLaks

+0

¿De verdad? ¿Puedes proporcionar un ejemplo/fuente? Siempre he supuesto que todos los punteros tienen el mismo tamaño porque todos se refieren a ubicaciones de memoria dentro del mismo espacio de direcciones. – Matt

+4

@Matt: Un contraejemplo trivial es un puntero de función; ese no es necesariamente el mismo espacio de direcciones. Ver también: http://stackoverflow.com/questions/916051/are-there-are-any-platforms-where-pointers-to-different-types-have-different-siz. –

Respuesta

27

Dado un tipo arbitrario (que he elegido char aquí, pero eso es por el bien de ejemplo concreto):

char *p; 

Puede utilizar cualquiera de estas expresiones:

sizeof(p) 
sizeof(char *) 

que conduce a una cal malloc() l tales como:

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

La última versión tiene algunos beneficios en que si el tipo de ppc cambios, la expresión todavía asigna el espacio correcto.

+4

Paréntesis opcional en la primera expresión. –

+3

@CarlNorum Es cierto, pero creo que aclaran bastante la expresión. Esa es una cuestión de estilo, y no algo que deba ser editado. –

+2

+1 para identificar que se prefiere la última versión. –

11

Esto debería hacer el truco:

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

debería ser capaz de lograr su objetivo. No importa cuál sea la plataforma, este código debería funcionar.

Cuestiones relacionadas