¿Cómo puede encontrar el tamaño de un tipo de datos sin crear una variable o un puntero, o usar sizeof del tipo de datos?

Las preguntas que se muestran a continuación son una entrevista.

P) Se le da un tipo de datos, digamos X en C.

El requisito es obtener el tamaño del tipo de datos, sin declarar una variable o una variable de puntero de ese tipo,

Y, por supuesto, sin usar el operador sizeof!

No estoy seguro si esta pregunta fue hecha antes en SO.

Gracias y saludos Maddy

Puede escribir 0 (o cualquier valor arbitrario) para escribir el tipo de datos X * para encontrar el tamaño del tipo de datos, como en el siguiente ejemplo:

#include  struct node{ char c; int i; }; int main() { printf("Sizeof node is: %d\n", ((char *)((struct node *)0 + 1) - (char *)((struct node *)0))); // substract 2 consecutive locations starting from 0 that point to type node, //typecast these values to char * to give the value in number of bytes. return 0; } 

define sizeof_type (type) (size_t) ((type *) 1000 + 1) – (size_t) ((type *) 1000)

El original es de esta discusión. http://www.linuxquestions.org/questions/programming-9/how-to-know-the-size-of-the-variable-without-using-sizeof-469920/

Esto debería funcionar:

 #include  typedef struct { int i; short j; char c[5]; } X; int main(void) { size_t size = (size_t)(((X*)0) + 1); printf("%lu", (unsigned long)size); return 0; } 

Explicación de size_t size = (size_t)(((X*)0) + 1);

  • asumiendo que un sizeof(X) devolvería 12 ( 0x0c ) debido a la alineación
  • ((X*)0) hace un puntero de tipo X apunta a la ubicación de memoria 0 ( 0x00000000)
  • + 1 incrementa el puntero en el tamaño de un elemento de tipo X , por lo que apunta a 0x0000000c
  • la expresión (size_t)() convierte la dirección, que viene dada por la expresión (((X*)0) + 1) a un tipo integral ( size_t )

Espero que le dé alguna idea.

Declare una estructura con un miembro de ese tipo, luego use offsetof para calcular el tamaño?

 struct outer { X x; char after; }; 

offsetof(outer, after) debe darle el tamaño (alineado) de x. Tenga en cuenta que no estoy declarando una variable de ese tipo per se, ni un puntero al tipo, sino que la incluyo como miembro de una statement de estructura, donde mido la ubicación del miembro que viene después.

La macro offsetof puede definirse como

 #define offsetof(S, f) ((size_t)(&((S *)0)->f)) 
 printf("%d",(int)(&x+1)-(int)&x