Page 130

2.4 Registros

Alineamientos El operador sizeof devuelve el tama˜ no en bytes de un tipo o variable. Analiza este programa:

alineamiento.c 1

alineamiento.c

#include <stdio.h>

2 3 4 5 6

struct Registro { char a; int b; };

7 8 9 10 11 12

int main(void) { printf ("Ocupaci´ on: %d bytes\n", sizeof (struct Registro)); return 0; }

Parece que vaya a mostrar en pantalla el mensaje ((Ocupaci´ on: 5 bytes)), pues un char ocupa 1 byte y un int ocupa 4. Pero no es as´ı: Ocupaci´ on: 8 bytes La raz´ on de que ocupe m´ as de lo previsto es la eficiencia. Los ordenadores con arquitectura de 32 bits agrupan la informaci´ on en bloques de 4 bytes. Cada uno de esos bloques se denomina ((palabra)). Cada acceso a memoria permite traer al procesador los 4 bytes de una palabra. Si un dato est´ a a caballo entre dos palabras, requiere dos accesos a memoria, afectando seriamente a la eficiencia del programa. El compilador trata de generar un programa eficiente y da prioridad a la velocidad de ejecuci´ on frente al consumo de memoria. En nuestro caso, esta prioridad se ha traducido en que el segundo campo se almacene en una palabra completa, aunque ello suponga desperdiciar 3 bytes en el primero de los campos.

10 11

char dni[LONDNI+1]; };

12 13 14 15 16 17

int main(void) { struct Persona ejemplo; char linea[81]; int i, longitud ;

18 19 20 21

printf ("Nombre: "); gets(ejemplo.nombre); printf ("Edad : "); gets(linea); sscanf (linea, "%d", &ejemplo.edad ); printf ("DNI : "); gets(ejemplo.dni);

22 23 24 25

printf ("Nombre le´ ıdo: %s\n", ejemplo.nombre); printf ("Edad le´ ıda : %d\n", ejemplo.edad ); printf ("DNI le´ ıdo : %s\n", ejemplo.dni);

26 27 28 29 30 31 32

printf ("Iniciales del nombre: "); longitud = strlen(ejemplo.nombre); for (i=0; i<longitud ; i++) if (ejemplo.nombre[i] >= ’A’ && ejemplo.nombre[i] <= ’Z’) printf ("%c", ejemplo.nombre[i]); printf ("\n");

33 34 35 36 37 38 39

124

printf ("Letra del DNI: "); longitud = strlen(ejemplo.dni); if (ejemplo.dni[longitud -1] < ’A’ || ejemplo.dni[longitud -1] > ’Z’) printf ("No tiene letra.\n"); else printf ("%c\n", ejemplo.dni[longitud -1]); Introducci´ on a la Programaci´ on con C

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement