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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  acceder a estructura puntero dentro de estructura
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: acceder a estructura puntero dentro de estructura  (Leído 3,871 veces)
0x46-F

Desconectado Desconectado

Mensajes: 14


Ver Perfil
acceder a estructura puntero dentro de estructura
« en: 13 Octubre 2018, 16:31 pm »

No entiendo por que al compilar mi programa crashea y eso que he intentado de todo pero no he conseguido solucionarlo.

Código:
#include <stdio.h>

typedef struct _hexagon {
    int *vertice;
    int *path;
    int resourceType;
} hexagon;


typedef struct _game {
    hexagon *hexagons;
} Game;

int main()
{
    int i1 = 1;
    int i2 = 2;
    int i3 = 3;
    int i4 = 4;
    int i5 = 5;
    int i6 = 6;

    Game g;
    g.hexagons->vertice = &i1;


    printf("%d \n", g.hexagons->vertice);


    return 0;
}


En línea

Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: acceder a estructura puntero dentro de estructura
« Respuesta #1 en: 13 Octubre 2018, 19:03 pm »

Define el puntero con recursividad, y revisa este codigo de nada
Código
  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5. int a=0; //Declaración de variable entera de tipo entero
  6. int *puntero; //Declaración de variable puntero de tipo entero
  7. puntero = &a; //Asignación de la dirección memoria de a
  8.  
  9. printf("El valor de a es: %d. \nEl valor de *puntero es: %d. \n",a,*puntero);
  10. printf("La dirección de memoria de *puntero es: %p",puntero);
  11.  
  12. return 0;
  13. }


« Última modificación: 13 Octubre 2018, 20:38 pm por Beginner Web » En línea

7w7
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: acceder a estructura puntero dentro de estructura
« Respuesta #2 en: 13 Octubre 2018, 20:31 pm »

Son punteros y los punteros sólo apuntan a sitios, no guardan datos. Así que g.hexagons al ser un simple puntero no contiene nada dentro.
Debes dimensionar un hexagon en la memoria del montón con malloc, de esta forma sí podrás acceder a vertice y éste sí apuntará a un dato, en tu caso a i1. Cómo lo has dimensionado a mano debes liberarlo a mano con free.

En el printf vas a acceder a a un dato apuntado por un puntero por lo que debes dereferenciarlo con *, en caso contrario verás la dirección de memoria del puntero, no el dato dónde apunta.
En línea

0x46-F

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: acceder a estructura puntero dentro de estructura
« Respuesta #3 en: 13 Octubre 2018, 21:59 pm »


Son punteros y los punteros sólo apuntan a sitios, no guardan datos. Así que g.hexagons al ser un simple puntero no contiene nada dentro.
Debes dimensionar un hexagon en la memoria del montón con malloc, de esta forma sí podrás acceder a vertice y éste sí apuntará a un dato, en tu caso a i1. Cómo lo has dimensionado a mano debes liberarlo a mano con free.

En el printf vas a acceder a a un dato apuntado por un puntero por lo que debes dereferenciarlo con *, en caso contrario verás la dirección de memoria del puntero, no el dato dónde apunta.
¿Puedes poner algun ejemplo? es mejor usar malloc aqui?
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: acceder a estructura puntero dentro de estructura
« Respuesta #4 en: 13 Octubre 2018, 23:16 pm »

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct tipo_interior {
  5.    int *pint;
  6. } interior;
  7.  
  8. typedef struct {
  9.    interior *pinterior;
  10. } exterior;
  11.  
  12. int main() {
  13.    int entero = 1;
  14.  
  15.    exterior e;
  16.    e.pinterior = malloc(sizeof(interior));
  17.    e.pinterior->pint = &entero;
  18.  
  19.    printf("%d", *e.pinterior->pint);
  20.  
  21.    free(e.pinterior);
  22. }

e existe en la pila, por lo tanto es un dato que C trata automáticamente.
e.pinterior sólo es un puntero, para poder usar la estructura hay que dimensionarla en algún sitio. Cómo no se hace en la pila hay que llamar a malloc para que la dimensione en el montón. Al hacerlo de esa forma es responsabilidad del programador liberarla. Eso es lo que hace free(e.pinterior).
entero existe en la pila y cómo pasa con e C lo trata de forma automática.
e.pinterior->pint apunta a entero, por tanto y cómo ya existe (tiene dimensión) no hay que hacer nada. En estos casos lo que se debe procurar es que un puntero apunte a una de estas variables que C va a liberar automáticamente, que esta desaparezca pero siga existiendo el puntero, que ahora apuntaría a una zona de memoria sin dimensionar.
En línea

0x46-F

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: acceder a estructura puntero dentro de estructura
« Respuesta #5 en: 14 Octubre 2018, 00:52 am »

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct tipo_interior {
  5.    int *pint;
  6. } interior;
  7.  
  8. typedef struct {
  9.    interior *pinterior;
  10. } exterior;
  11.  
  12. int main() {
  13.    int entero = 1;
  14.  
  15.    exterior e;
  16.    e.pinterior = malloc(sizeof(interior));
  17.    e.pinterior->pint = &entero;
  18.  
  19.    printf("%d", *e.pinterior->pint);
  20.  
  21.    free(e.pinterior);
  22. }

e existe en la pila, por lo tanto es un dato que C trata automáticamente.
e.pinterior sólo es un puntero, para poder usar la estructura hay que dimensionarla en algún sitio. Cómo no se hace en la pila hay que llamar a malloc para que la dimensione en el montón. Al hacerlo de esa forma es responsabilidad del programador liberarla. Eso es lo que hace free(e.pinterior).
entero existe en la pila y cómo pasa con e C lo trata de forma automática.
e.pinterior->pint apunta a entero, por tanto y cómo ya existe (tiene dimensión) no hay que hacer nada. En estos casos lo que se debe procurar es que un puntero apunte a una de estas variables que C va a liberar automáticamente, que esta desaparezca pero siga existiendo el puntero, que ahora apuntaría a una zona de memoria sin dimensionar.
Muchas gracias , pero tengo una pequeña duda, ¿esto siempre ocurre cuando tienes una estructura tipo puntero dentro de una misma?
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: acceder a estructura puntero dentro de estructura
« Respuesta #6 en: 14 Octubre 2018, 02:12 am »

Esto es trabajo con punteros. Da igual si es en estructura o fuera de ella. Para usar un dato antes debe existir.
En línea

0x46-F

Desconectado Desconectado

Mensajes: 14


Ver Perfil
Re: acceder a estructura puntero dentro de estructura
« Respuesta #7 en: 14 Octubre 2018, 11:55 am »

Esto es trabajo con punteros. Da igual si es en estructura o fuera de ella. Para usar un dato antes debe existir.
muchas gracias la verdad es que me sirvió de mucho tu ayuda
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Acceder a una matriz dentro de una estructura ?
Programación C/C++
d00ze13 5 5,435 Último mensaje 2 Enero 2011, 20:52 pm
por Garfield07
Duda con respecto a puntero a estructura
Programación C/C++
Curioso0078 2 1,863 Último mensaje 9 Marzo 2017, 18:00 pm
por MAFUS
Para que sirve un puntero a una estructura?
Programación C/C++
Curioso0078 3 1,923 Último mensaje 15 Marzo 2017, 12:48 pm
por ivancea96
Ayuda con una estructura y puntero //winsock//
Programación C/C++
str0nghack 4 2,389 Último mensaje 22 Junio 2018, 18:17 pm
por str0nghack
¿Como declarar un array dentro de una estructura en MASM?
ASM
Usuario887 2 4,264 Último mensaje 23 Febrero 2021, 23:03 pm
por Usuario887
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines