[*]
sud03r
Tengo un tipo de datos, digamos X
y quiero saber su tamaño sin declarar una variable o puntero de ese tipo y por supuesto sin usar sizeof
operador.
es posible? Pensé en usar archivos de encabezado estándar que contienen tamaño y rango de tipos de datos, pero eso no funciona con el tipo de datos definido por el usuario.
En mi opinión, esto encaja en la categoría de “¿cómo agrego dos enteros sin usar ++, += o +?”. Es una pérdida de tiempo. Puedes intentar evitar los monstruos de comportamiento indefinido haciendo algo como esto.
size_t size = (size_t)(1 + ((X*)0));
Tenga en cuenta que yo no declarar una variable de tipo o puntero a X
.

dmckee — gatito ex-moderador
Mirar, sizeof
es la facilidad de idioma para esto. El único, por lo que es la única forma portátil de lograrlo.
Para algunos casos especiales, podría generar un código no portátil que usara alguna otra heurística para comprender el tamaño de objetos particulares.[*] (probablemente haciéndoles realizar un seguimiento de su propio tamaño), pero usted mismo tendría que hacer toda la contabilidad.
[*] Objetos en un sentido muy general en lugar del sentido OOP.

chicle
Bueno, soy un aficionado… pero probé este problema y obtuve la respuesta correcta sin usar sizeof. Espero que esto ayude … Estoy tratando de encontrar el tamaño de un número entero.
int *a,*s, v=10;
a=&v;
s=a;
a++;
int intsize=(int)a-(int)s;
printf("%d",intsize);
La respuesta correcta a esta pregunta de la entrevista es “¿Por qué querría hacer eso, cuando sizeof() lo hace por mí y es el único método portátil para hacerlo?”
La posibilidad de relleno impide todas las esperanzas sin el conocimiento de las reglas utilizadas para su introducción. Y esos son dependientes de la implementación.

norman ramsey
Podrías descifrarlo leyendo el ITB para su procesador en particular, lo que explica cómo se distribuyen las estructuras en la memoria. Es potencialmente diferente para cada procesador. Pero a menos que esté escribiendo un compilador, es sorprendente que no quiera usar solo sizeof
que es la forma correcta de resolver este problema.
si X es tipo de datos:
#define SIZEOF(X) (unsigned int)( (X *)0+1 )
si X es una variable:
#define SIZEOF(X) (unsigned int)( (char *)(&X+1)-(char *)(&X) )
¿Qué quieres decir con “por supuesto sin usar sizeof”? ¿Por qué por supuesto?
– John Kugelmann
2 de agosto de 2009 a las 16:25
Al ser un acertijo, tienes que encontrar un método inusual y posiblemente absurdo para hacerlo. Mira mi respuesta.
– Stefano Borini
2 de agosto de 2009 a las 16:29
Pregunta de seguimiento: quiero incluir un archivo de encabezado que escribí, sin usar ninguna directiva de preprocesador, por supuesto. ¿Cómo puedo hacer eso?
– John Kugelmann
2 de agosto de 2009 a las 16:35
¿Por qué importa si esta persona debe usar algo o no? La pregunta es cómo hacerlo sin usar sizeof y podemos ser útiles para responderla o no. ¿A quién le importa si arruinará una pregunta de la entrevista? El objetivo de este sitio web es ayudar a los demás, no desmenuzar una pregunta hasta que se ajuste a lo que queremos.
– Mike B.
5 de agosto de 2009 a las 15:29
Siguiente en esta serie: cómo obtener la dirección de sin usar un ampersand. ¡Manténganse al tanto!
– salvaje
5 de junio de 2012 a las 11:45