Ver Mensaje Individual
  #9 (permalink)  
Antiguo 16/12/2010, 06:19
Avatar de Munire
Munire
 
Fecha de Ingreso: julio-2010
Ubicación: en el ciberdespacio (España)
Mensajes: 150
Antigüedad: 13 años, 10 meses
Puntos: 4
Respuesta: Problema de principiante con struct en C

Cita:
Iniciado por luface2000 Ver Mensaje
Hola,

he puesto la variable tAlumno palmera dentro del main y creo que tienes razón, es más purista pero funciona.



Entiendo que creas un tipo tAlumnos de struct y que albergará una tabla de struct de 3 posiciones en el caso de código que muestro. En la práctica ira la secuencia 0,1,2, es decir tres posiciones. El tema es que cuando ejecutas el programa por pantalla de la consola hace un printf de todos los casos. El tema es que no entiendo como hace la secuencia la tabla. Si es tNino datos[3] debería ser 0,1,2 pero en realidad hace 0,1,2,3. Es lo que no entiendo. Por ejemplo, el que código que pego a continuación


para tNino datos[4] no da error y son 5 datos, pero si pongo tNino datos[3] el mensaje que muestra en consola es,
Código:
Hola Mundo
Los datos son: ID=0 Nombre=Laura Año Nacimiento=2000 y Edad=10
Esto imprime el primer caracter de Laura que es = L
Los datos son: ID=1 Nombre=Pablo Año Nacimiento=2003 y Edad=8
Los datos son: ID=2 Nombre=Pili Año Nacimiento=1972 y Edad=38
Los datos son: ID=3 Nombre=Lorenzo Año Nacimiento=1968 y Edad=42
Los datos son: ID=4 Nombre=Lorenzo Año Nacimiento=1968 y Edad=42
Segmentation fault

------------------
(program exited with code: 0)
Press return to continue

con lo que rebosa la tabla confirmando lo que digo. ¿Entonces como maneja el inicio y final de esa tabla? Lo siento, es un ladrillo de pregunta.

Gracias.
segmentation fault significa violacion de acceso esto quiere decir que estas escribiendo en un area restringida, que no tienes los permisos, por que seguramente ya habra algo escrito ahi.

si creas 3 datos: datos[3]
reservas tantos bytes por 3 (por que son 3 datos)

y si asignas valores a datos 5 por ejemplo_: datos[5].nombre
estas escribiendo en un area que no has reservado pero te deja por que existe.

x0 x1 x2 x3 x4 x5 x6 ..... (espacios de memoria)
_______ (reservas 3)

dato es un puntero al primer elemento. si pones dato[1] es lo mismo que apuntar a dato[0] + 1 , es decir estas escribiendo en el siguiente espacio de memoria.

si escribes en x5 , aunque no lo hayas reservado te deja pero por que se da el caso de que esta vacio, tambien se podria dar el caso de que estuviera ocupado (segmentation fault)