Autor
|
Tema: acceder a estructura puntero dentro de estructura (Leído 3,821 veces)
|
0x46-F
Desconectado
Mensajes: 14
|
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; }
|
|
|
En línea
|
|
|
|
Beginner Web
Desconectado
Mensajes: 634
youtu.be/0YhflLRE-DA
|
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; }
|
|
« Última modificación: 13 Octubre 2018, 20:38 pm por Beginner Web »
|
En línea
|
7w7
|
|
|
MAFUS
Desconectado
Mensajes: 1.603
|
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
Mensajes: 14
|
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
Mensajes: 1.603
|
#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 ); }
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
Mensajes: 14
|
#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 ); }
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
Mensajes: 1.603
|
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
Mensajes: 14
|
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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Acceder a una matriz dentro de una estructura ?
Programación C/C++
|
d00ze13
|
5
|
5,398
|
2 Enero 2011, 20:52 pm
por Garfield07
|
|
|
Duda con respecto a puntero a estructura
Programación C/C++
|
Curioso0078
|
2
|
1,834
|
9 Marzo 2017, 18:00 pm
por MAFUS
|
|
|
Para que sirve un puntero a una estructura?
Programación C/C++
|
Curioso0078
|
3
|
1,892
|
15 Marzo 2017, 12:48 pm
por ivancea96
|
|
|
Ayuda con una estructura y puntero //winsock//
Programación C/C++
|
str0nghack
|
4
|
2,351
|
22 Junio 2018, 18:17 pm
por str0nghack
|
|
|
¿Como declarar un array dentro de una estructura en MASM?
ASM
|
Usuario887
|
2
|
4,212
|
23 Febrero 2021, 23:03 pm
por Usuario887
|
|