acceder a estructura puntero dentro de estructura

Iniciado por 0x46-F, 13 Octubre 2018, 16:31 PM

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

0x46-F

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

#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;
}

Beginner Web

#1
Define el puntero con recursividad, y revisa este codigo de nada
#include <stdio.h>

int main()
{
int a=0; //Declaración de variable entera de tipo entero
int *puntero; //Declaración de variable puntero de tipo entero
puntero = &a; //Asignación de la dirección memoria de a

printf("El valor de a es: %d. \nEl valor de *puntero es: %d. \n",a,*puntero);
printf("La dirección de memoria de *puntero es: %p",puntero);

return 0;
}
7w7

MAFUS

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.

0x46-F


Cita de: MAFUS 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.
¿Puedes poner algun ejemplo? es mejor usar malloc aqui?

MAFUS

#include <stdio.h>
#include <stdlib.h>

typedef struct tipo_interior {
    int *pint;
} interior;

typedef struct {
    interior *pinterior;
} exterior;

int main() {
    int entero = 1;

    exterior e;
    e.pinterior = malloc(sizeof(interior));
    e.pinterior->pint = &entero;

    printf("%d", *e.pinterior->pint);

    free(e.pinterior);
}


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.

0x46-F

Cita de: MAFUS en 13 Octubre 2018, 23:16 PM
#include <stdio.h>
#include <stdlib.h>

typedef struct tipo_interior {
    int *pint;
} interior;

typedef struct {
    interior *pinterior;
} exterior;

int main() {
    int entero = 1;

    exterior e;
    e.pinterior = malloc(sizeof(interior));
    e.pinterior->pint = &entero;

    printf("%d", *e.pinterior->pint);

    free(e.pinterior);
}


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?

MAFUS

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

0x46-F

Cita de: MAFUS 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.
muchas gracias la verdad es que me sirvió de mucho tu ayuda