elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Ayuda] Array dinamico malloc/realloc con puntero doble
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Ayuda] Array dinamico malloc/realloc con puntero doble  (Leído 3,262 veces)
mokaNordic

Desconectado Desconectado

Mensajes: 7


Ver Perfil
[Ayuda] Array dinamico malloc/realloc con puntero doble
« en: 26 Noviembre 2014, 14:11 pm »

Buenas tardes,
Estoy trabajando en un programa que lee ficheros, saca ciertos datos etc etc...
Linea por linea del fichero csv voy extrayendo el contenido con strtok y lo voy guardando en arrays.
El programa lee unas cuantas lineas pero luego falla y se sale sin dar mayor explicación.

Como imagino que será que no reservo bien memoria, he aislado el cómo trato la memoria con un pequeño programa (el que incluyo) donde se pide añadir una serie de nombres de Alumnos, y después pedir más.

El programa según añado cambios, he llegado a conseguir que lo visualice bien y finalice...pero se comporta bastante mal.

Por ejemplo si pongo un system("pause") antes de sacar por pantalla el listado final (el último for), y el numero de alumnos nuevos es menor que el numero de alumnos añadidos inicialmente lo muestra bien.
Si el numero de alumnos nuevos supera al inicial, aun con esa pausa, el programa falla.

He comparado, mirado webs, inclusive en este foro en temas anteriores para tratar de solventarlo... y no doy con la cuestión.

Gracias de antemano, toda posible pista seguro que me es de ayuda.
Un saludo

Adjunto el código:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#define NOMBRE 20

typedef struct{
                //... demás variables que no afectan a la cuestion .../
      char **listado_alumnos;
      }registro;
      
int alumnado(registro *profesor);


void main(){
   registro profesor;
   alumnado(&profesor);
}
      
int alumnado(registro *profesor)
{
     int cant, i,n_mas,tam;
     char cdn[100];
     system("cls");
     printf("Numero de alumnos: ");
     scanf("%d", &cant);
     fflush(stdin);
   
    profesor->listado_alumnos = (char **)malloc(cant * sizeof(char)); //reservo "filas"
    if(profesor->listado_alumnos==NULL){
         fprintf(stderr,"Error en la asignacion de memoria");
         exit(-1);
         }
         
     for(i = 0; i < cant; i++)
     {
      printf("Nombre Alumno %d: ", i + 1);
                scanf("%s",&cdn);
      fflush(stdin);
      profesor->listado_alumnos=(char*)malloc(NOMBRE*sizeof(char)); /*reservo "columnas" */
      strcpy(profesor->listado_alumnos,cdn);
     }
       
   //IMPRIMO
     printf("LISTA DE ALUMNOS\n--------------------\n");
     for(i = 0; i < cant; i++)
        printf("->%d.\t%s\n", i + 1, profesor->listado_alumnos);
   
      //sin añadir la parte de realloc ya falla el programa
   
   printf("\n Cuantos alumnos mas quieres incluir:");
   scanf("%d", &n_mas);
        fflush(stdin);
   
   int tam_total= n_mas+cant;
   profesor->listado_alumnos=realloc(profesor->listado_alumnos,(tam_total)*sizeof(char *));/*reasigno "filas"*/
   
   for(i = cant+1; i <(tam_total+1); i++) //reasigno "columnas"
          {
      printf("Nombre Alumno %d: ", i + 1);
           scanf("%s",&cdn);
      fflush(stdin);
           profesor->listado_alumnos = (char*)malloc(NOMBRE*sizeof(char));
      strcpy(profesor->listado_alumnos,cdn);
          }
   //IMPRIMO 2º ronda
    printf("ALUMNOS NUEVOS\n--------------------\n");
         for(i = cant+1; i <(tam_total+1); i++)
        printf("->%d.\t%s\n", i + 1, profesor->listado_alumnos);
   
    //system("pause");
    //imprimo todo el listado_alumnos   
    printf("LISTA TOTAL DE ALUMNOS\n--------------------\n");
         for(i = 0; i < tam_total; i++)
        printf("->%d. \t %s \n", i + 1, profesor->listado_alumnos);

   //libero memoria
   for(i=0;i<tam_total;i++){
      free(*(profesor->listado_alumnos+i));
    }
   free(profesor->listado_alumnos);
   
     system("pause");
     return 0;
   
}



En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: [Ayuda] Array dinamico malloc/realloc con puntero doble
« Respuesta #1 en: 26 Noviembre 2014, 14:47 pm »

Bienvenido al foro.

Un par de detalles:

  • El código tienes que "decorarlo" usando las etiquegas GeSHi, se leerá mejor y evitarás que combinaciones tipo [ i ] (sin espacios) sean sustituidas por etiquetas html
  • fflush está pensado para vaciar los bufferes de salida no los de entrada. Aplicar fflush a un buffer de entrada puede dar un resultado indeterminado.
  • "cdn" tiene tamaño 100 y para los nombres reservas únicamente 20 caracteres... lo lógico es que fuesen iguales. ¿Estás seguro que ningún nombre supera los 19 caracteres de longitud?

Además:

Código
  1. profesor->listado_alumnos = (char **)malloc(cant * sizeof(char));

el sizeof está mal... si estas reservando memoria para un puntero doble, el sizeof tiene que corresponderse con un puntero, no con un char... sino estás reservando memoria de menos. Un char son 8 bits y un puntero 32 (o 64).

La reserva debería hacerse así:

Código
  1. profesor->listado_alumnos = (char **)malloc(cant * sizeof(char*));

Imagino que el problema que tienes se encuentra ahí, ya me lo confirmarás.

Un saludo.


En línea

mokaNordic

Desconectado Desconectado

Mensajes: 7


Ver Perfil
Re: [Ayuda] Array dinamico malloc/realloc con puntero doble
« Respuesta #2 en: 28 Noviembre 2014, 01:36 am »

Buenas!

Gracias por la bienvenida y gracias por tu respuesta.
Diste en el clavo porque ahora funciona perfectamente, tanto el programa de testeo como la aplicación real en la que trabajaba.
Tomo buena nota también del fflush, y sobre el tamaño de los nombres aunque tienes razón, no tiene mayor relevancia ya que solo pasaba en el programilla ese de prueba.

Un saludo y muchas gracias,
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Malloc y array ??
Programación C/C++
<<<-Basura->>> 2 3,454 Último mensaje 4 Octubre 2011, 15:19 pm
por LearningSpanishProgrammer
[C] Memoria dinámica. Malloc, Realloc
Programación C/C++
GGZ 1 2,931 Último mensaje 19 Noviembre 2015, 01:44 am
por GGZ
Multiplicacion de matrices con malloc y realloc
Programación C/C++
mc275 2 3,165 Último mensaje 29 Mayo 2017, 05:56 am
por mc275
Segmentacion Fault al llamar a la funcion free con un puntero creado con malloc
Programación C/C++
Gallu 2 2,693 Último mensaje 1 Noviembre 2017, 20:21 pm
por Gallu
Ayuda con array de punteros de tamaño dinámico !
Programación C/C++
statham 1 1,829 Último mensaje 20 Marzo 2019, 21:08 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines