Foros del Web » Programación para mayores de 30 ;) » C/C++ »

error en ejecucion desconocido

Estas en el tema de error en ejecucion desconocido en el foro de C/C++ en Foros del Web. Buenass.. ando teniendo un problema que todavia no puedo detectar. Lo que trato de hacer es asignar una cadena a un miembro de un tipo ...
  #1 (permalink)  
Antiguo 28/06/2006, 13:38
lpz
 
Fecha de Ingreso: abril-2006
Ubicación: Argentina
Mensajes: 402
Antigüedad: 18 años, 8 meses
Puntos: 2
error en ejecucion desconocido

Buenass.. ando teniendo un problema que todavia no puedo detectar. Lo que trato de hacer es asignar una cadena a un miembro de un tipo que creè. Si compila pero cuando ejecuto el programa me tira un run time error...

Probe de varias formas para ver si me podia deshacer de esto.. sin usar puntero a la estructura.. usando una matriz de este tipo (cosa que no me iba a llevar a ninguna parte)... pero sigo con lo mismo. No creo que haya errores en tipos porque sino el compilador se hubiera quejado..... pero bueno, abajo esta el codigo... En el titulo del post dice desconocido ya que me muestra ese mensaje de windows, pero nada que yo pueda leer y decir.. si, debe ser esto...................alguna sugerencia?

typedef struct
{
char *nombre;
int edad;
char *ubicacion;
} persona;

main() {

persona *personas;
personas->nombre="entrada";

}
  #2 (permalink)  
Antiguo 28/06/2006, 14:35
 
Fecha de Ingreso: mayo-2006
Mensajes: 40
Antigüedad: 18 años, 7 meses
Puntos: 0
Evidentemente todavia no manejas bien el concepto de apuntadores. Sin animo de ofender, te aconsejaria que consiguieras un libro de C basico y te repasaras bien el(los) capitulo(s) que trate(n) sobre apuntadores.
Un error es que no asignas espacio en memoria para la estructura persona. Puedes resolverlo de dos maneras: o declaras la variable personas como del tipo de la estructura (o sea que no sea apuntador) asi
Código:
persona personas;
en cuyo caso ya no usarias el operador -> para referirte a uno de los campos, sino el operador punto, o sea, que en vez de escribir
Código:
personas->nombre="entrada";
escribirias
Código:
personas.nombre="entrada";
o solicitas memoria dinamica a traves de la funcion malloc (declarada en <stdlib.h>) asi
Código:
personas = (persona *)malloc (sizeof (persona);
solo que haciendolo de esta manera tendrias que llamar despues a la funcion free (personas) cuando ya no uses esta variable.

Por otra parte, a pesar de que la linea
Código:
personas->nombre="entrada";
tecnicamente no tiene errores, ya que cuando pones una cadena constante directamente en el codigo el compilador crea espacio de memoria y pasa un apuntador al comienzo de ella, esta no es la manera en que rellenas un campo de alguna estructura del tipo que declaraste, y generalmente durante el transcurso del programa actualizas los valores de los campos, por lo que tendrias el mismo problema mencionado anteriormente, que es que no asignas memoria en el campo para almacenar el nombre. Por ejemplo, si yo quisiera leer un nombre desde el teclado y pasarselo al campo nombre asi
Código:
scanf ("%s", personas->nombre);
el programa compilaria bien pero "tronaria" en tiempo de ejecucion. Y otra vez, o aparto memoria en la definicion de la estructura para este campo, o despues solicito memoria dinamica con la funcion malloc
  #3 (permalink)  
Antiguo 28/06/2006, 14:59
lpz
 
Fecha de Ingreso: abril-2006
Ubicación: Argentina
Mensajes: 402
Antigüedad: 18 años, 8 meses
Puntos: 2
Gracias por tu respuesta.
No hace mucho que estoy aprendiendo C asi que evidentemente no manejare todo al paso de la letra de una vez... de a poquito..
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:00.