c void-pointers

c: tamaño del vacío*



void-pointers (2)

Estoy un poco confundido con un puntero void * en C. Especialmente después de leer esta pregunta: ¿el tamaño de (un puntero) siempre es igual a cuatro? , donde una persona dice que no hay garantía de que sizeof (int *) == sizeof (double *)

Mi pregunta es: ¿existe una garantía de sizeof (void *)> = sizeof (cualquier otro tipo de puntero)? En otras palabras, ¿siempre puedo asignar un puntero some_type * a un puntero void * y luego recuperarlo como some_type *?


El valor almacenado en el puntero es una dirección a la memoria. Si está en un sistema de 32 bits, el puntero a la memoria tendrá una longitud de 32 bits (o cuatro bytes). Si está en un sistema de 64 bits, ese puntero en la memoria tendrá una longitud de 64 bits (u ocho bytes).

El tamaño de los datos que mantienen la ubicación en la memoria no tiene nada que ver con el tamaño de los datos representados en esa ubicación en la memoria.

En cuanto a cómo un char * difiere de un double * , el char * puede apuntar a cualquier ubicación, pero el double * tiene que apuntar a algo a lo largo de un límite de ocho bytes. Los datos más grandes se deben alinear de acuerdo con las reglas del procesador en el que se encuentra. Por lo tanto, los punteros a datos pequeños generalmente no son compatibles con punteros a datos grandes (por ejemplo, no debe apuntar un puntero double * a una dirección char * ); pero está ahorrando yendo en la otra dirección (por ejemplo, puede apuntar un puntero char * a una dirección double * ).


Sólo los punteros de datos. void * puede contener cualquier puntero de datos, pero no punteros de función.

Aquí hay una C FAQ .

los void * ''s solo tienen garantía de mantener punteros de objetos (es decir, datos); no es portátil convertir un puntero de función para escribir void *. (En algunas máquinas, las direcciones de funciones pueden ser muy grandes, más grandes que cualquier puntero de datos).

En cuanto a la primera parte, sí, diferentes tipos pueden tener punteros de diferentes tamaños :