Ver Mensaje Individual
  #11 (permalink)  
Antiguo 26/02/2010, 19:19
Avatar de genuine_carlosV2
genuine_carlosV2
 
Fecha de Ingreso: noviembre-2008
Ubicación: 127.0.0.1
Mensajes: 296
Antigüedad: 15 años, 5 meses
Puntos: 6
Respuesta: un struct imprime mas de lo permitido

Buenas,

Veamos, yo he ejecutado esto y no me ha dado ningún problema. En cualquier caso, voy a lanzar una hipótesis a ver si acierto:

Para almacenar el teléfono, usáis un string de 9 caracteres que, imagino, es la longitud del teléfono que queréis almacenar, por ejemplo, 623456789. Debéis tener en cuenta que un string necesita el carácter de finalización (\0) y, por tanto, para almacenar cualquier dato en formato string, necesitaréis X caracteres para el dato más 1 para el carácter de finalización. Para el teléfono, serían 10 caracteres.

Cuando a printf se le dice que imprima un string, inicia un bucle e imprime uno a uno todos los caracteres hasta que se encuentra el carácter de finalización. Si no lo habéis tenido en cuenta, pueden suceder 4 cosas:
1) Que vuestro programa esté bien echo y sólo haya almacenado 8 caracteres y, por tanto, se imprima bien
2) Que vuestro programa esté medianamente mal echo y haya almacenado 9 caracteres de modo que imprimirá caracteres hasta encontrar el de finalización (es decir, imprimirá, literalmente, lo que hay en RAM). En la RAM hay bastantes bytes a 0 y por eso imprime cosas raras sin saltar error.
3) Que vuestro programa esté mal echo y almacene tantos caracteres como le dais. Al suceder esto, se están (o pueden estar) machacando posiciones de RAM destinadas a código u otras variables. Estos son los casos que, más adelante en el mismo programa, originan el fallo de segmentación. La suerte en este caso, es que igualmente, el programa añade el carácter de final de string y el efecto visual es que imprime todo lo que le habéis dado por lo que parece que no respeta el límite de 9 pero, aparentemente, funciona bien.
4) Que vuestro programa esté mal echo, almacene tantos caracteres como le dais (por tanto, empiece a comer memoria RAM asignada a otras variables/códigos), no añada el carácter de final de string y, tengáis la mala suerte de no encontrar un carácter de final de string en la zona reservada a vuestro programa. Esto provoca que se empiece a imprimir la RAM en pantalla hasta que intenta imprimir posiciones fuera del rango asignado (por el sistema operativo) al programa y, por tanto, os salte un fallo de segmentación. El efecto visual sería el del punto 2 añadiendo el fallo de segmentación al final.

Por lo que he visto o me parece, si mi hipótesis es correcta, estáis en el punto 3. Para comprobarlo, os invito a que, si os aburrís le introduzcáis un string MUUUUUUUUUUUUUUUUUUUUY largo y lo más probable es que al dar a intro, os salte un fallo de segmentación por intentar escribir fuera de rango. También podéis probar de leer un string de este tipo al inicio de un programa que haga muchas más cosas y, probablemente, o tendréis resultados inesperados (cálculos aparentemente mal echos (es cuando el ordenador dice que 2 + 3 = -786342 y tu te quedas mirando la pantalla diciendo "pos vale, apaga y vámonos") o tendréis un fallo de segmentación en cualquier otro punto del programa.

En fin, esto es sólo una hipótesis.

P.D.: Para leer string, os recomiendo la función 'gets'. Y, sino, probad de, como lo hacéis ahora, almacenar en un mismo string, el nombre y apellido de una persona separado por un espacio.

Un saludo
__________________
Carlos

Recoger datos es solo el primer paso hacia la sabiduría. Pero compartir información es el primer paso hacia la comunidad. - IBM