| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Parlante3d
Registrado: 11 Mar 2007 Mensajes: 8
| Publicado: 08/09/2007 2:12 pm | | | Título: consulta con sizeof de una estructura |
| seguramente es una pavada pero no se q pasa....
typedef struct {
long int id;
short int tipo;
char longitud;
} header;
printf("el tamaño de la cabecera es de: %d\n",sizeof(header));
y eso me da 8....
ahora, yo cuento, long int son 4, short int son 2, y char es 1, me da 7.
incluso hago un sizeof(long int),sizeof(short int),sizeof(char), y me dan los valores antes mencionados.
seguramente se me esta escapando algo pero no se q pueda ser.
Muchas Gracias.
Saludos |
| | Volver arriba | |  | spesmod
Registrado: 23 Ago 2007 Mensajes: 33
| Publicado: 08/09/2007 2:39 pm | | | Título: |
| Hola la verdad no me imagino que le puede pasar a tu pc pero tampoco es lo peor del mundo, no te hagas bolas, los tamaños de las variables dependen de factores diversos (a veces extraños). En mi compu si sale como tamaño 7 segun este codigo:
| Código: | #include <stdio.h> #include <conio.h>
typedef struct{ long int id; short int tipo; char longitud; } header;
int main() { clrscr(); printf("el tamaño de la cabecera es de: %d\n", sizeof(header)); getch(); }
|
y la respuesta es 7, pero esa estructura (header) tb es valida asi:
| Código: | typedef struct{ long int id; int tipo; char longitud; } header;
|
prueba de esa forma (obviando "short"), estoy seguro que no tiene nada que ver, pero no pierdes nada intentando,... por cierto que compilador usas¿?¿?¿? _________________ |--A--Q--U--A--|
|
| | Volver arriba | |  | Parlante3d
Registrado: 11 Mar 2007 Mensajes: 8
| Publicado: 08/09/2007 2:49 pm | | | Título: |
| a mi con ese codigo, me sigue dando 8.
cambiando short int a int me da 12
uso gcc 4.1.2 en linux |
| | Volver arriba | |  | | digies
Registrado: 18 Nov 2005 Mensajes: 241 Ubicación: Cono Sur
| Publicado: 08/09/2007 4:38 pm | | | Título: |
| Hola
No hay que suponer que el tamaño de una estructura es la suma de los tamaños de sus miembros. Debido a requisitos de alinación para diferentes objetos, podría haber "huecos" no identificados dentro de una estructura. Así por ejemplo, si un char es de un byte y un int de cuatro bytes, la estructura:
| Código: | struct mi_estructura { char c; int i; };
|
bien podría requerir ocho bytes, no cinco. El operador sizeof regresa el valor apropiado.
Un saludo. |
| | Volver arriba | |  | rir3760

Registrado: 01 Oct 2004 Mensajes: 3657 Ubicación: Mexico
| Publicado: 08/09/2007 4:45 pm | | | Título: |
| El porque el tamaño de la estructura es ocho (no puede ser siete, eso se explica mas adelante) se debe al "padding" (bytes de relleno dentro de la estructura utilizados para mantener la alineacion).
Por partes:
1) "Alineacion" es un concepto que (si recuerdo bien) depende de la implementacion y usualmente significa que la posicion a partir de la cual se almacena un valor debe ser multiplo del tamaño de este. Por ejemplo si el tamaño de un int es cuatro las posiciones donde se puede almacenar un entero son 0, 4, 8, ... y no puede almacenarse uno de estos valores a partir de posiciones que no sean multiplos como 31 o 47, esto ultimo produciria undefined behaviour o comportamiento no definido.
2) La direccion en memoria de una estructura es equivalente a la direccion en memoria de su primer campo, esto nos lleva a que podemos tomar la direccion de la estructura (mediante el operador '&') y mediante la conversion explicita apropiada utilizarla para acceder directamente al primer campo.
Para explicarlo mejor, siguiendo el ejemplo que mencionan:
| Código: | header estructura; long *pa_primer_campo;
/* ... */
pa_primer_campo = (long *) &estructura; /* valido */ printf("El valor del primer campo es %ld\n", *pa_primer_campo);
/* ... */ |
Ya por ultimo el tamaño de la estructura no puede ser siete ya que en el caso de un array de estructuras almacenado (en un caso puramente teorico) a partir de la posicion cero el segundo elemento del array (almacenado a partir de la posicion siete) no cumpliria con el requisito de alineacion de su primer campo (multiplo de cuatro).
Todo esto bajo el supuesto de que el tamaño de los tipos long y short es cuatro y dos, respectivamente.
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | Parlante3d
Registrado: 11 Mar 2007 Mensajes: 8
| Publicado: 08/09/2007 5:15 pm | | | Título: |
| millones de gracias, me estaba volviendo loco.
entonces, permitanmente hacerles una consulta.
Estoy cargando una estructura q quiero enviar por medio de sockets, hasta q uds. me sacaron de mi error hacia un send con sizeof(estructura), si bien esto es correcto (por lo q entendi de sus respuestas), es la manera optima de hacerlo?
Muchas gracias nuevamente,
saludos. |
| | Volver arriba | |  | | cheroky
Registrado: 22 Sep 2005 Mensajes: 1372 Ubicación: En ecx esperando un call
| Publicado: 08/09/2007 5:46 pm | | | Título: |
| | Parlante3d escribió: | millones de gracias, me estaba volviendo loco.
entonces, permitanmente hacerles una consulta.
Estoy cargando una estructura q quiero enviar por medio de sockets, hasta q uds. me sacaron de mi error hacia un send con sizeof(estructura), si bien esto es correcto (por lo q entendi de sus respuestas), es la manera optima de hacerlo?
Muchas gracias nuevamente,
saludos. |
Perdon por usar un quote literal pero es un tema practicamante nuevo.
El operador sizeof retorna el tamaño en bytes de su operando, y si, puedes usar este como argumento para indicar el bloque en bytes que requiere send.
S2. _________________ - Explícito es mejor que implícito. - Simple es mejor que complejo. - Complejo es mejor que complicado. - Plano es mejor que anidado. - Ralo es mejor que denso. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |