Ayuda con memoria dinamica

Iniciado por mari2diaz, 10 Febrero 2020, 05:44 AM

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

mari2diaz

Que error tengo en la linea 128?

mercado->p = (struct Puestos) malloc(sizeof(struct Puestos) * tam);

y si hago estas dos funciones

void espacio_memoria(Mercados *mercado); para crear espacio en memoria de todo
void free_memoria(Mercados *mercado); y para liberarla

también me funciona?

/* Se necesita la información de los mercados municipales de ciudad Guayana, indicando
  el nombre de cada mercado, dirección, TLF y la información del coordinador del
  mercado (c.i, nombre, apellido y teléfono). Cada mercado tiene un máximo de 50
  puestos, a cada puesto se le específica un nro de local y tamaño (largo y ancho),
  datos del propietario (TLF, c.i, nombre y apellido) y cada local almacena
  adicionalmente los ingresos por cada mes del año.
 
  *Realizar una función para solicitar la información y una para mostrarla, usar dichas
  funciones para un total de 20 mercados municipales
 
   *Crear las cadenas dinámicamente.
   *Los puestos de mercado crearlos dinámicamente.
   *Los mercados crearlos dinámicamente. */
 
#include<stdio.h>
#include<stdlib.h>

typedef struct Mercados_Municipales{
char* nombre;
char* direccion;
char* telefono;
struct Datos_Coordinador *info_c;
struct Puestos *p;
}Mercados;

struct Datos_Coordinador{
char* nombrec;
char* apellidoc;
char* cedulac;
char* telefonoc;
};

struct Puestos{
int numero;
struct Tamano *t;
struct Datos_Propietario *info_p;
int* mensual;
};

struct Tamano{
float largo;
float ancho;
};

struct Datos_Propietario{
char* nombrep;
char* apellidop;
char* cedulap;
char* telefonop;
};

void Presentacion();
Mercados *Leer_Mercado();

int main(){

Mercados *mercados[20];
char desicion;
int cantidad;

Presentacion();

for(cantidad = 0; cantidad < 20; cantidad ++){

printf("\tMercado Municipal #%d\n\n", cantidad + 1);
mercados[cantidad] = Leer_Mercados();

do{
printf("Pasamos a otro? [S/N] ", cantidad);
desicion = getchar(); // Leemos un caracter
while(getchar() == EOF); // Necesario para se coma el \n
}while(desicion != 'S' && desicion != 's' && desicion != 'N' && desicion != 'n');
if(desicion == 'N' || desicion == 'n') break; // Si elige N, se sale

}

return 0;
}

void Presentacio(){
printf("\t\t*********************************\n");
printf("\t\t*         Giudad Guayana        *\n");
printf("\t\t*      Mercados Municipales     *\n");
printf("\t\t*********************************\n\n");
}

Mercados *Leer_Mercado(){

Mercados *mercado = (Mercados *) malloc(sizeof(Mercados));

mercado->nombre = (char *) malloc(sizeof(char) * 20);
mercado->direccion = (char *) malloc(sizeof(char) * 50);
mercado->telefono = (char * ) malloc(sizeof(char) * 15);

printf("Nombre: ");
gets(mercado->nombre);
printf("Direccion: ");
gets(mercado->direccion);
printf("Telefono: ");
gets(mercado->telefono);

printf("\nInformacion del Coordinador\n\n");

mercado->info_c = (struct Datos_Coordinador *) malloc(sizeof(struct Datos_Coordinador));

mercado->info_c->nombrec = (char *) malloc(sizeof(char) * 20);
mercado->info_c->apellidoc = (char *) malloc(sizeof(char) * 20);
mercado->info_c->cedulac = (char *) malloc(sizeof(char) * 15);
mercado->info_c->telefonoc = (char *) malloc(sizeof(char) * 15);

printf("\tNombre: ");
gets(mercado->info_c->nombrec);
printf("\tApellido: ");
gets(mercado->info_c->apellidoc);
printf("\tCedula: ");
gets(mercado->info_c->cedulac);
printf("\tTelefono: ");
gets(mercado->info_c->telefonoc);

printf("\nNumero de Locales ");
int i, tam; scanf("%d", &tam);

mercado->p = (struct Puestos) malloc(sizeof(struct Puestos) * tam);

for(i = 0; i < tam; i++){

mercado->p[i]->numero = i;

mercado->p[i]->t = (struct Tamano) malloc(sizeof(struct Tamano));

mercado->p[i]->info_p = (struct Datos_Propietario) malloc(sizeof(struct Datos_Propietario));
mercado->p[i]->info_p->nombrep = (char *) malloc(sizeof(char) * 20);
mercado->p[i]->info_p->apellidop = (char *) malloc(sizeof(char) * 20);
mercado->p[i]->info_p->cedulap = (char *) malloc(sizeof(char) * 15);
mercado->p[i]->info_p->telefonop = (char *) malloc(sizeof(char)* 15);

printf("\n\tTamaño [L/A]: ");
scanf("&d %d", &mercado->p->t->largo, &mercado->p->t->ancho);
printf("\tInformacion del Propietario\n\n");
printf("\t\tNonbre: ");
gets(mercado->p->info_p->nombrep);
printf("\t\tApellido: ");
gets(mercado->p->info_p->apellidop);
printf("\t\tCedula: ");
gets(mercado->p->info_p->cedulap);
printf("\t\tTelefono: ");
gets(mercado->p->info_p->telefonop);

printf("\n\tIngresos Mensuales: "); int j;
mercado->p->mensual = (int *) malloc(sizeof(int) * 12);

for(j = 0; j < 12; j++){
printf("\t\t#%d. ", j + 1);
scanf("%d", &mercado->p->mensual[j]);
}

}

return mercado;
}

MAFUS

Con malloc tienes que hacer un cast al tipo de puntero, no a la estructura. Por ejemplo:

int *i = (int*) malloc(sizeof(int));


Pero si estás usando un compilador de C, a diferencia de uno de C++, éste es capaz de inferir el tipo de dato que debe castear. Por tanto es mejor si quitas el cast. Así:

int *i = malloc(sizeof(int));
[code]

Pero si estás programando en C con un compilador de C++ sí deberás hacer el cast.
[/code]