Fallo en segmentación inexplicable (al menos para mi)

Iniciado por Gallu, 17 Julio 2010, 12:47 PM

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

Gallu

Hola a todos , ejecutando el siguiente programa me da un fallo en segmentación , alguien me podria decia  a que se debe ? gracias de antemano



#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct {
char *nombre;
char *direccion;
int edad;
char *dni;
}type_persona;

crear_cliente(type_persona *cliente){
   char aux[50];
   int aux2;

       printf("%s", "\nCreando cliente......\n");
       printf("\nNombre del cliente :");
       fgets(aux,50,stdin);
       cliente->nombre = (char*) malloc(strlen(aux) * sizeof(char));
       strcpy(cliente->nombre , aux);
       memset(aux,' ',50);

       printf("\nDirección del Cliente:");
       fgets(aux,50,stdin);
       cliente->direccion = (char*) malloc(strlen(aux)*sizeof(char*));
       strcpy(cliente->direccion , aux);
       memset(aux,' ',50);

       printf("\nDNI del Cliente:");
       fgets(aux,50,stdin);
       cliente->dni =(char*) malloc(strlen(aux)*sizeof(char*));
       strcpy(cliente->dni , aux);

       printf("\nEdad del Cliente:");
       scanf("%d", &(cliente->edad));
       printf("\nsu edad es %d", cliente->edad);

       printf("\n Cliente creado !!!!");

}

int main(){
   type_persona *cliente;

   crear_cliente(cliente);

   printf("\n%s %s %s", cliente->dni , cliente->nombre , cliente->direccion );

   return 0;
   
}

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

Og.

crear_cliente(type_persona *cliente) no tiene tipo de retorno.

deberia ser:
Código (cpp) [Seleccionar]
void crear_cliente(type_persona *cliente)

y al compilar en gcc no me da ningún Fallo de segmentación. Que compilador usas?
|-

cbug

El fallo de segmentación luego de la muestra se debe a que no reservas el espacio en memoria para el puntero a la estructura, prueba añadiendo:


    cliente = (type_persona*)(malloc(sizeof(type_persona)));

Gallu

Gracias por vuestras respuestas ...

Cita de: Og. en 17 Julio 2010, 15:31 PM
crear_cliente(type_persona *cliente) no tiene tipo de retorno.

deberia ser:
Código (cpp) [Seleccionar]
void crear_cliente(type_persona *cliente)

y al compilar en gcc no me da ningún Fallo de segmentación. Que compilador usas?

uso gcc y el error era al ejecutar, no al compilar , el prototipo del método
crear cliente está en un .h , al postear el código olvide ponerlo


Cita de: cbug en 17 Julio 2010, 15:33 PM
El fallo de segmentación luego de la muestra se debe a que no reservas el espacio en memoria para el puntero a la estructura, prueba añadiendo:


    cliente = (type_persona*)(malloc(sizeof(type_persona)));


si, era esto lo que estaba fallando , gracias

Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.


nicolas_cof

Didacso, algunos consejos...

> Utiliza strncpy() en vez de strcpy()

https://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html

> Nunca haces uso de la variable int aux2;

> Tanto Didacso como cbug, no hace falta castear malloc() ya que esta devuelve un void*

> En dni y direccion es sizeof( char ); no sizeof( char* );

> Te falta asignar espacio para el caracter finalizador de cadena '\0'

cliente->dni = malloc( (strlen( aux ) + 1) * sizeof( char ) );

> Acuerdate de liberar la memoria con free() para no dejar memory leaks

Salu10.