Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mari2diaz en 10 Febrero 2020, 05:44 am



Título: Ayuda con memoria dinamica
Publicado por: mari2diaz en 10 Febrero 2020, 05:44 am
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?

Código
  1. /* Se necesita la información de los mercados municipales de ciudad Guayana, indicando
  2.    el nombre de cada mercado, dirección, TLF y la información del coordinador del
  3.    mercado (c.i, nombre, apellido y teléfono). Cada mercado tiene un máximo de 50
  4.    puestos, a cada puesto se le específica un nro de local y tamaño (largo y ancho),
  5.    datos del propietario (TLF, c.i, nombre y apellido) y cada local almacena
  6.    adicionalmente los ingresos por cada mes del año.
  7.    
  8.    *Realizar una función para solicitar la información y una para mostrarla, usar dichas
  9.    funciones para un total de 20 mercados municipales
  10.    
  11.     *Crear las cadenas dinámicamente.
  12.     *Los puestos de mercado crearlos dinámicamente.
  13.     *Los mercados crearlos dinámicamente. */
  14.  
  15. #include<stdio.h>
  16. #include<stdlib.h>
  17.  
  18. typedef struct Mercados_Municipales{
  19. char* nombre;
  20. char* direccion;
  21. char* telefono;
  22. struct Datos_Coordinador *info_c;
  23. struct Puestos *p;
  24. }Mercados;
  25.  
  26. struct Datos_Coordinador{
  27. char* nombrec;
  28. char* apellidoc;
  29. char* cedulac;
  30. char* telefonoc;
  31. };
  32.  
  33. struct Puestos{
  34. int numero;
  35. struct Tamano *t;
  36. struct Datos_Propietario *info_p;
  37. int* mensual;
  38. };
  39.  
  40. struct Tamano{
  41. float largo;
  42. float ancho;
  43. };
  44.  
  45. struct Datos_Propietario{
  46. char* nombrep;
  47. char* apellidop;
  48. char* cedulap;
  49. char* telefonop;
  50. };
  51.  
  52. void Presentacion();
  53. Mercados *Leer_Mercado();
  54.  
  55. int main(){
  56.  
  57. Mercados *mercados[20];
  58. char desicion;
  59. int cantidad;
  60.  
  61. Presentacion();
  62.  
  63. for(cantidad = 0; cantidad < 20; cantidad ++){
  64.  
  65. printf("\tMercado Municipal #%d\n\n", cantidad + 1);
  66. mercados[cantidad] = Leer_Mercados();
  67.  
  68. do{
  69. printf("Pasamos a otro? [S/N] ", cantidad);
  70. desicion = getchar(); // Leemos un caracter
  71. while(getchar() == EOF); // Necesario para se coma el \n
  72. }while(desicion != 'S' && desicion != 's' && desicion != 'N' && desicion != 'n');
  73. if(desicion == 'N' || desicion == 'n') break; // Si elige N, se sale
  74.  
  75. }
  76.  
  77. return 0;
  78. }
  79.  
  80. void Presentacio(){
  81. printf("\t\t*********************************\n");
  82. printf("\t\t*         Giudad Guayana        *\n");
  83. printf("\t\t*      Mercados Municipales     *\n");
  84. printf("\t\t*********************************\n\n");
  85. }
  86.  
  87. Mercados *Leer_Mercado(){
  88.  
  89. Mercados *mercado = (Mercados *) malloc(sizeof(Mercados));
  90.  
  91. mercado->nombre = (char *) malloc(sizeof(char) * 20);
  92. mercado->direccion = (char *) malloc(sizeof(char) * 50);
  93. mercado->telefono = (char * ) malloc(sizeof(char) * 15);
  94.  
  95. printf("Nombre: ");
  96. gets(mercado->nombre);
  97. printf("Direccion: ");
  98. gets(mercado->direccion);
  99. printf("Telefono: ");
  100. gets(mercado->telefono);
  101.  
  102. printf("\nInformacion del Coordinador\n\n");
  103.  
  104. mercado->info_c = (struct Datos_Coordinador *) malloc(sizeof(struct Datos_Coordinador));
  105.  
  106. mercado->info_c->nombrec = (char *) malloc(sizeof(char) * 20);
  107. mercado->info_c->apellidoc = (char *) malloc(sizeof(char) * 20);
  108. mercado->info_c->cedulac = (char *) malloc(sizeof(char) * 15);
  109. mercado->info_c->telefonoc = (char *) malloc(sizeof(char) * 15);
  110.  
  111. printf("\tNombre: ");
  112. gets(mercado->info_c->nombrec);
  113. printf("\tApellido: ");
  114. gets(mercado->info_c->apellidoc);
  115. printf("\tCedula: ");
  116. gets(mercado->info_c->cedulac);
  117. printf("\tTelefono: ");
  118. gets(mercado->info_c->telefonoc);
  119.  
  120. printf("\nNumero de Locales ");
  121. int i, tam; scanf("%d", &tam);
  122.  
  123. mercado->p = (struct Puestos) malloc(sizeof(struct Puestos) * tam);
  124.  
  125. for(i = 0; i < tam; i++){
  126.  
  127. mercado->p[i]->numero = i;
  128.  
  129. mercado->p[i]->t = (struct Tamano) malloc(sizeof(struct Tamano));
  130.  
  131. mercado->p[i]->info_p = (struct Datos_Propietario) malloc(sizeof(struct Datos_Propietario));
  132. mercado->p[i]->info_p->nombrep = (char *) malloc(sizeof(char) * 20);
  133. mercado->p[i]->info_p->apellidop = (char *) malloc(sizeof(char) * 20);
  134. mercado->p[i]->info_p->cedulap = (char *) malloc(sizeof(char) * 15);
  135. mercado->p[i]->info_p->telefonop = (char *) malloc(sizeof(char)* 15);
  136.  
  137. printf("\n\tTamaño [L/A]: ");
  138. scanf("&d %d", &mercado->p->t->largo, &mercado->p->t->ancho);
  139. printf("\tInformacion del Propietario\n\n");
  140. printf("\t\tNonbre: ");
  141. gets(mercado->p->info_p->nombrep);
  142. printf("\t\tApellido: ");
  143. gets(mercado->p->info_p->apellidop);
  144. printf("\t\tCedula: ");
  145. gets(mercado->p->info_p->cedulap);
  146. printf("\t\tTelefono: ");
  147. gets(mercado->p->info_p->telefonop);
  148.  
  149. printf("\n\tIngresos Mensuales: "); int j;
  150. mercado->p->mensual = (int *) malloc(sizeof(int) * 12);
  151.  
  152. for(j = 0; j < 12; j++){
  153. printf("\t\t#%d. ", j + 1);
  154. scanf("%d", &mercado->p->mensual[j]);
  155. }
  156.  
  157. }
  158.  
  159. return mercado;
  160. }
  161.  


Título: Re: Ayuda con memoria dinamica
Publicado por: MAFUS en 10 Febrero 2020, 11:18 am
Con malloc tienes que hacer un cast al tipo de puntero, no a la estructura. Por ejemplo:
Código:
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í:
Código:
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]