Ayuda memoria dinámica


Xerezano

Miembro muy activo
Hola a todos.
Estoy con un proyecto de la universidad y estoy desarrollando un modulo para dar de alta/baja usuarios y/o modificarlos pero o el programa crashea al intentar añadir usuarios ("return value 3221226356") o despues de añadirlo pasa lo de la imagen siguiente :

Captura.PNG


*Los nueve primeros usuarios vienen por defecto, sin embargo, el decimo lo añadi yo debiendo aparecer realmente 10.- a -[a a]*

Supongo que el problema se encuentra en el aumento de reserva de memoria en esta linea de codigo "db = (usuario*)realloc(db,(num+1)*sizeof(usuario)); " pero no estoy seguro.

Gracias de antemano.

Aqui el codigo :
C:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "memoria.h"
#include "admin_cliente.h"

/*PROTOTIPOS*/
void escribir(usuario*, int);
int altas(usuario*, int);
void bajas(usuario*, int);
void mod(usuario*, int);
/*FIN_PROTOTIPOS*/

void adm_cliente(usuario* db){
    /*VARIABLES*/
    int opc,n,nuevo,borrado;
    /*INICIALIZACION*/
    opc = 0;
    nuevo = 0;
    borrado = 0;
    n = 0;
    n = getmaxlength()+nuevo-borrado;
    /*MENU ADMIN_CLIENTES*/
    do{
        n = getmaxlength()+nuevo-borrado-1;
        system("cls");
        fflush(stdin);
        fflush(stdout);
        printf("ADMINISTRACION CLIENTES");
        printf("\n-----------\n");
        fprintf(stdout,"| 1.Informacion clientes\n| 2.Altas\n| 3.Bajas\n| 4.Modificaciones\n| 5.Listas\n| 6.Buscar\n| 0.Salir\n");
        printf("Introduzca opcion : ");
        scanf("%i",&opc);
        fflush(stdout);
        switch (opc){
            case 1:
                escribir(db,n);
                system("pause");
                break;
            case 2:
                nuevo += altas(db,n);
                n++;
                break;
            case 3:
                bajas(db,n);
                borrado+=1;
                n--;
                break;
            case 4:
                mod(db,n);
            default:
                return;
                break;
        }
    }while(opc != 0);
}

void escribir(usuario* db, int n){
    int i;
    i=0;
    fflush(stdout);
    printf("Lista Clientes %i : \n",n);
    for(i=0;i<=n;i++){
        fflush(stdout);
        //if(strcmp(db[i].type,"Cliente")==0)
            printf(" > %i.%s - [%s %s] - i:%i\n",i,db[i].email,db[i].nombre,db[i].apellido,i);
    }
}

int altas(usuario* db, int num){
    db = (usuario*)realloc(db,(num+1)*sizeof(usuario));
    if(db==NULL){
        printf("Could not allocate memory");
        exit(1);
    }
    char aux[15];
    //num++;
    fflush(stdin);
    system("cls");
    printf("Registro nuevo cliente : \n");
    printf("\nEmail : ");
    scanf("%s",aux);
    strcpy(db[num].email,aux);
    fflush(stdin);
    printf("Contrase%ca : ",164);
    scanf("%s",aux);
    strcpy(db[num].pass,aux);
    fflush(stdin);
    printf("Nombre : ");
    scanf("%s",aux);
    strcpy(db[num].nombre,aux);
    printf("Apellido : ");
    fflush(stdin);
    scanf("%s",aux);
    strcpy(db[num].apellido,aux);
    printf("Provincia : ");
    fflush(stdin);
    scanf("%s",aux);
    strcpy(db[num].provincia,aux);
    printf("Localidad : ");
    fflush(stdin);
    scanf("%s",aux);
    strcpy(db[num].localidad,aux);
    printf("Direccion : ");
    scanf("%s",aux);
    strcpy(db[num].direccion,aux);
    fflush(stdin);
    strcpy(db[num].type,"Cliente");
    db[num].id = num;
    printf("\nCliente ID : %i - Guardado -\n",num);
    system("pause");
    return 1;
}
void bajas(usuario* db, int n){
    int del,i;
    del=0;
    system("cls");
    escribir(db,n);
    printf("Seleccione usuario : ");
    scanf("%i",&del);
        for(i=del;i<n;i++){
        fflush(stdout);
        strcpy(db[i].email,db[i+1].email);
        fflush(stdout);
        if((i+1)<n){
            strcpy(db[i].nombre,db[i+1].nombre);
            strcpy(db[i].apellido,db[i+1].apellido);
            strcpy(db[i].provincia,db[i+1].provincia);
            strcpy(db[i].localidad,db[i+1].localidad);
            strcpy(db[i].direccion,db[i+1].direccion);
            strcpy(db[i].type,db[i+1].type);
        }
    }
    system("pause");
}
void mod(usuario* db,int n){
    int m;
    escribir(db,n);
    printf("Selecciona usuario a modificar : ");
    scanf("%i",&m);
}
Código:

Gracias.
 
  • Like
Reacciones : KTaneR y destapeman

destapeman

FUCK PUSSYS, YES BADASS
Moderador
Paladín de Nodo
Jinete de Nodo
Burgués de Nodo
Noderador
Nodero
Noder
No se nada de C, pero UP para que lo vea la gente y puedan echarte un cable
 
  • Like
Reacciones : Xerezano

KTaneR

Activo muy miembro
Burgués de Nodo
Noderador
Nodero
Noder
Pasa el error exacto cuando crashea, haz pantallazo. Hace mucho que no toco c pero intento echarte un cable.

De todad formas si es de la uni ahora mas que nunca atenderan tus dudas por correo jajajs
 
Última edición:

Xerezano

Miembro muy activo
Pasa el error exacto cuando crashea, haz pantallazo. Hace mucho que no toco c pero intento echarte un cable.

De todad formas si es de la uni ahora mas que nunca atenderan tus dudas por correo jajajs

He mirado y por lo visto no devuelve nigun codigo de error simplemente para la ejecucion y salta el return value que dije antes.

Si he mandado un correo al profesor pero este tio se lo toma todo con calma aunque estemos en cuarentena jajaja. De todas formas gracias.
 

destapeman

FUCK PUSSYS, YES BADASS
Moderador
Paladín de Nodo
Jinete de Nodo
Burgués de Nodo
Noderador
Nodero
Noder
He mirado y por lo visto no devuelve nigun codigo de error simplemente para la ejecucion y salta el return value que dije antes.

Si he mandado un correo al profesor pero este tio se lo toma todo con calma aunque estemos en cuarentena jajaja. De todas formas gracias.
Si no te lanza error, entiendo que no se debe a un fallo de programación,sino a un fallo del algoritmo....¡creo!
 
  • Like
Reacciones : KTaneR