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

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con arreglo dinamico de estructura
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con arreglo dinamico de estructura  (Leído 2,628 veces)
palacio29

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Problema con arreglo dinamico de estructura
« en: 15 Junio 2019, 00:48 am »

Tengo que hacer un programa en el cual recibo por funcion un arreglo estatico de estructura y una letra.
Luego, tengo que crear un arreglo dinamico de estructura en el cual tengo que guardar los datos del arreglo estatico en el cual el codigo que tenga sea igual al pasado por parametro.
Luego, tengo que guardarlo en orden ascendente e imprimirlo por pantalla.
El problema es que en un momento del programa, creo que el problema esta en el while que esta entre la linea 51 y 64.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define T 3
  4. struct s_alumno
  5. {
  6.    int leg;
  7.    char*nombre;
  8.    unsigned char cod_car
  9. };
  10. typedef struct s_alumno t_alumno;
  11. t_alumno*filtrar(t_alumno[T],char cod_car);
  12. int main()
  13. {
  14.    t_alumno arreglo[T];
  15.    t_alumno*lista=NULL;
  16.    int i=0;
  17.    arreglo[0].leg=3;
  18.    arreglo[1].leg=4;
  19.    arreglo[2].leg=5;
  20.    arreglo[0].nombre="Claudio";
  21.    arreglo[1].nombre="Hernan";
  22.    arreglo[2].nombre="Pablo";
  23.    arreglo[0].cod_car='A';
  24.    arreglo[1].cod_car='B';
  25.    arreglo[2].cod_car='C';
  26.  
  27.    printf("Legajo: %d  - Nombre: %s - Codigo Carrera: %c\n",arreglo[0].leg,arreglo[0].nombre,arreglo[0].cod_car);
  28.    printf("Legajo: %d  - Nombre: %s - Codigo Carrera: %c\n",arreglo[1].leg,arreglo[1].nombre,arreglo[1].cod_car);
  29.    printf("Legajo: %d  - Nombre: %s - Codigo Carrera: %c\n",arreglo[2].leg,arreglo[2].nombre,arreglo[2].cod_car);
  30.  
  31.    lista=filtrar(arreglo,'B');
  32.  
  33.    while((lista+i)->leg!=0)
  34.    {
  35.        printf("Legajo: %d  - Nombre: %s - Codigo Carrera: %c\n",(lista+i)->leg,(lista+i)->nombre,(lista+i)->cod_car);
  36.        i++;
  37.    }
  38.  
  39.    return 0;
  40. }
  41. t_alumno*filtrar(t_alumno arreglo[T],char cod_car)
  42. {
  43.  
  44.    t_alumno*nuevo=NULL;
  45.    t_alumno aux;
  46.    nuevo=malloc(sizeof(struct s_alumno));
  47.    int i=0,j=0,k=0,maximo=0;
  48.    char codigo;
  49.  
  50.  
  51.    while(i<T)
  52.    {
  53.        if(arreglo[i].cod_car==cod_car)
  54.        {
  55.            (nuevo+k)->leg=arreglo[i].leg;
  56.            (nuevo+k)->cod_car=arreglo[i].cod_car;
  57.            strcpy((nuevo+k)->nombre,arreglo[i].nombre);
  58.            printf("Legajo: %d  - Nombre: %s - Codigo Carrera: %c\n",(nuevo+k)->leg,(nuevo+k)->nombre,(nuevo+k)->cod_car);
  59.            k++;
  60.            nuevo=realloc(nuevo,(1+k)*sizeof(struct s_alumno));
  61.        }
  62.        i++;
  63.    }
  64.    (nuevo+k)->leg=0;
  65.    printf("El legajo en el ultimo es %d",(nuevo+k)->leg);
  66.  
  67.            /// ORDENAR///
  68.            for(maximo=0;(nuevo+maximo)->leg!=0;maximo++);
  69.            printf("Maximo es %d",maximo);
  70.            for(i=1;i<maximo;i++)
  71.            {
  72.                for(j=0;j<maximo-1;j++)
  73.                {
  74.                    aux=*(nuevo+j);
  75.                    *(nuevo+j)=*(nuevo+j+1);
  76.                    *(nuevo+j+1)=aux;
  77.                }
  78.            }
  79.  
  80.  
  81.            return nuevo;
  82.  
  83. }


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Problema con arreglo dinamico de estructura
« Respuesta #1 en: 15 Junio 2019, 02:25 am »

En ningún momento estás reservando memoria para <nombre> de ninguna instancia de la struct <s_alumno>. Lo único que haces en el <main> es hacer que el puntero a <nombre> apunte a una cadena literal que se encuentra en otra zona de memoria. Por lo tanto no puedes usar <strcpy()> ya que estás intentando copiar datos en una zona no permitida de memoria.

PD: Se agradecen nombres de variables más significativos que ayuden a seguir el programa con facilidad.


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
palacio29

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Re: Problema con arreglo dinamico de estructura
« Respuesta #2 en: 15 Junio 2019, 04:21 am »

En ningún momento estás reservando memoria para <nombre> de ninguna instancia de la struct <s_alumno>. Lo único que haces en el <main> es hacer que el puntero a <nombre> apunte a una cadena literal que se encuentra en otra zona de memoria. Por lo tanto no puedes usar <strcpy()> ya que estás intentando copiar datos en una zona no permitida de memoria.

PD: Se agradecen nombres de variables más significativos que ayuden a seguir el programa con facilidad.

Disculpa por las variables, son horribles, ya lo se.
Y si quisiera asignar espacio en memoria para que funcione el strcpy que tendria que hacer?.
Porque la solucion que encontre es   (nuevo+k)->nombre=arreglo.nombre)
En línea

jmpesp

Desconectado Desconectado

Mensajes: 21


Ver Perfil
Re: Problema con arreglo dinamico de estructura
« Respuesta #3 en: 15 Junio 2019, 04:42 am »

Tengo que hacer un programa en el cual recibo por funcion un arreglo estatico de estructura y una letra.
Luego, tengo que crear un arreglo dinamico de estructura en el cual tengo que guardar los datos del arreglo estatico en el cual el codigo que tenga sea igual al pasado por parametro.
Luego, tengo que guardarlo en orden ascendente e imprimirlo por pantalla.
El problema es que en un momento del programa, creo que el problema esta en el while que esta entre la linea 51 y 64.

Tal como dice el compañero, tu programa esta crasheando en strcpy() porque "nombre" es un "wild pointer" (puntero no inicializado, solo dios sabe hacia que region de la memoria apunta y que hay ahi).

Debes, o bien reemplazar el puntero por un array de tipo char con un tamano definido, o reservar memoria para almacenar el nombre en ese puntero en la heap utilizando malloc(), calloc() o realloc().

Te recomiendo que compiles tus programas con simbolos de depuracion (opcion -g en gcc) y utilices algun debugger para localizar este tipo de problemas.

Te vas a ahorrar mucho tiempo tratando de encontrar el problema en el codigo y con el debugger vas a localizar el problema al instante.

Por otra parte, no deberias usar strcpy().
Esta funcion copia la cadena de origen en la cadena de destino sin tener en cuenta el espacio disponible en el destino.

Si la cadena de origen es mas grande que el tama;o del buffer, este se desbordaria, lo cual podria corromper la memoria o ser manipulado intencionalmente para cambiar el flujo del programa.

Utiliza en su defecto strncpy() o memcpy().

La diferencia de estas dos funciones es que aceptan como parametro el tama;o del buffer y solo copian "lo que entre", de esta manera se evita el desborde.

Código:
arreglo[2].nombre="Pablo";

Haciendo esto el puntero "nombre" apunta hacia la cadena constante "Pablo".
Si haces eso tene en cuenta que no vas a poder modificar la cadena a la que apunta "nombre" ya que es una constante.


« Última modificación: 15 Junio 2019, 04:46 am por jmpesp » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Problema con arreglo dinamico de estructura
« Respuesta #4 en: 15 Junio 2019, 12:33 pm »

Disculpa por las variables, son horribles, ya lo se.
Y si quisiera asignar espacio en memoria para que funcione el strcpy que tendria que hacer?.
Porque la solucion que encontre es   (nuevo+k)->nombre=arreglo.nombre)
Con esa solución que dices que has encontrado lo que haces es que el puntero <nombre> apunte a la misma cadena constante que apunta <arreglo>. Con esto ahorras reservas de memoria pero no estás "haciendo copias" del nombre, lo que estás haciendo es que los punteros apunten al mismo sitio.

Si lo quieres hacer con memoria dinámica tendrías que reservar memoria y cambiar las líneas 20-22 (que están haciendo que el puntero apunte al nombre) por <strncpy()> para copiar literalmente el contenido del <string> en el nuevo array dinámico que has creado.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Arreglo Dinamico con Objetos :S
Java
Xephiro 9 14,455 Último mensaje 6 Marzo 2009, 20:20 pm
por juancho77
Problema Con Un Arreglo Dinamico De Estructuras [?]
Programación C/C++
Omar_2013 2 2,719 Último mensaje 2 Septiembre 2013, 19:21 pm
por Omar_2013
Problema Con Un Arreglo Dinamico [?]
Programación C/C++
Omar_2013 4 2,862 Último mensaje 16 Octubre 2013, 23:35 pm
por Eternal Idol
Problema al copiar string a un arreglo string dinamico VS2013 ultimate
Programación C/C++
raver1983 1 2,584 Último mensaje 7 Febrero 2017, 01:11 am
por raver1983
(Consulta) Problema con un arreglo dinamico
Programación C/C++
palacio29 1 2,052 Último mensaje 31 Mayo 2019, 02:20 am
por K-YreX
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines