Tamaño bytes para una estructura

Iniciado por abreu20011, 9 Agosto 2012, 17:26 PM

0 Miembros y 1 Visitante están viendo este tema.

abreu20011

Saludos :)

Vengo con una duda a ver si alguien puede ayudarme un poco  ^^ Es un tema de concepto, que no sé si estoy haciendo bien algo.

Hablo de la función memset y como la he aplicado. Se supone que esta función sirve para inicializar una matriz a 0, indicandole el tamaño en bytes que queremos que ocupe.

Pero, ¿y cuando esa matriz es una matriz de estructura?
Mi código funciona, pero no tengo muy claro sí está bien programado:


typedef struct
{
char Nombre[20];
char Direccion[30];
int Telefono;
int Nota;
nDias Dias;
}fichaPersona;

fichaPersona Alumnos[20];

memset(Alumnos, 0, sizeof(int) * 20);


al parametro de sizeof le he dicho que es un entero. Pero la matriz Alumnos que tiene 20 posiciones, esta compuesta por 5 enteros y dos char.

¿Es correcto entonces poner sizeof(int) o tendria que poner otra cosa? A mi entender un solo entero tiene que ocupar menos bytes que 6 variables unidas :S

Muchas gracias! :)
Un saludo

rir3760

No, no es correcto ya que no colocas todos los bytes del array a cero.

Una forma mejor es utilizando el nombre del array y su numero de elementos:
fichaPersona Alumnos[20];
memset(Alumnos, 0, sizeof *Alumnos * 20);


También deberías eliminar la literal 20 (en su lugar utiliza una macro).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

abreu20011

#2
Cita de: rir3760 en  9 Agosto 2012, 19:41 PM
No, no es correcto ya que no colocas todos los bytes del array a cero.

Una forma mejor es utilizando el nombre del array y su numero de elementos:
fichaPersona Alumnos[20];
memset(Alumnos, 0, sizeof *Alumnos * 20);


También deberías eliminar la literal 20 (en su lugar utiliza una macro).

Muchisisisisimas gracias rir3760 ^^
Ya decía yo que no podía estar bien :)

Ahora mismo voy a mejorar mi código :D
Y gracias por el consejo de la macro, no la use por que es un ejercicio, pero está bien saberlo ^^

Un saludo y muchas gracias de nuevo :)

rir3760

Si debes asignar el valor cero varias veces en el programa lo mejor es utilizar la función "memset".

Por otra parte si solo deseas esa asignación como valor inicial puedes utilizar:
fichaPersona Alumnos[20] = {{0}};
Con ello en todos los elementos del array sus campos se inicializan con 0 (o 0.0 o NULL, de acuerdo al tipo de cada uno).

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

BlackZeroX

#4
También lo puedes dejar de esta manera:

fichaPersona Alumnos[20];
memset(Alumnos, 0, sizeof Alumnos);


sizeof AlumnosEs una abreviación de: sizeof *Alumnos * 20Aun que una equivalencia es usar sizeof(fichaPersona) * 20.

Dulces Lunas!¡.
The Dark Shadow is my passion.