Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema al acceder a memoria

Estas en el tema de Problema al acceder a memoria en el foro de C/C++ en Foros del Web. Hola muy buenas! Mirar tengo un problema al acceder a memoria. Dispongo de una estructura llamada superbloque. struct super_block { /* ptr al mapa bits ...
  #1 (permalink)  
Antiguo 28/07/2008, 09:40
 
Fecha de Ingreso: julio-2008
Mensajes: 2
Antigüedad: 15 años, 9 meses
Puntos: 0
Problema al acceder a memoria

Hola muy buenas!

Mirar tengo un problema al acceder a memoria. Dispongo de una estructura llamada superbloque.

struct super_block {

/* ptr al mapa bits del nodoi en memoria */
void *s_imap;

/* ptr al mapa de bits de bloques en memoria */
void *s_bmap;

/* ptr. al inodo del directorio raiz del sistema de ficheros */
struct inodo *s_iroot;
};

Como veis dentro de esta estructura tengo un puntero a otra estructura de tipo inodo.

extern struct inodo {
/* id de usuario del propietario del fichero */
unsigned short i_uid;

/* tamaño actual del fichero en bytes */
unsigned long i_tamanyo;

} inodos[FS_NUM_INODOS];

El problema que se nos plantea es que queremos tener una variable global

struct super_block *g_superbloque;

y durante la ejecucion damos valor al puntero s_iroot que inicialmente hemos reservado memoria para esa estructura.

g_superbloque->s_iroot=(struct inodo *)malloc(sizeof(struct inodo));

Y en el momento que queremos acceder a la información de la estructura de inodo por ejemplo i_tamanyo, a traves de g_superbloque nos da violacion de segmento.


Para acceder a dicha informacion hacemos:

(g_superbloque->s_iroot)->i_tamanyo


""Cosa que nos da fallo"" Hemos probado con el simbolo * delante de toda la linea pero ni siquiera nos compila.
Y cuando ponemos

&(g_superbloque->s_iroot)->i_tamanyo ---->>> nos devuelve 4, pero esto no puede estar bien. Ya no sabemos que podemos hacer!

Realmente la pregunta es..... ¿ Como accedemos a la información desde un puntero a una estructura (superbloque) que a su vez tiene un puntero a una estructura (inodo)?


Muchas graciasss!!!
  #2 (permalink)  
Antiguo 28/07/2008, 10:04
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema al acceder a memoria

Estas pidiendo memoria para un arreglo de struct inodos, para acceder a cada uno de esos struct inodos, tienes que hacer

g_superbloque->s_iroot[i] con i desde 0 hasta el nro de inodos que pediste.

A menos que haya un problema de prioridad de operadores y sea necesario parentizar asi:

(g_superbloque->s_iroot)[i], pero creo que -> tiene precedencia sobre [].
  #3 (permalink)  
Antiguo 06/08/2008, 10:14
 
Fecha de Ingreso: julio-2008
Mensajes: 2
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Problema al acceder a memoria

Hola de nuevo, sigo sin poder acceder al contenido y ya no se que mas probar. La cuestión es que no se muy bien cuál es el fin último de declarar una struct de la siguiente forma:

struct inodo{
...
}inodos[FS_NUM_INODOS];

siendo FS_NUM_INODOS una constante definida previamente. Es lo mismo que crearse un array que contiene inodos?
Quizás el problema es que no sabemos acceder a esta información y de ahí que se produzca la violación de segmento.

Un saludo y gracias de antemano.
  #4 (permalink)  
Antiguo 06/08/2008, 12:54
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Problema al acceder a memoria

No esta claro para mi, que es lo que te falla. La compilacion?
Que mensaje arroja el compilador en ese caso?
Que ocurre cuando en vez de usar tu codigo pones el codigo propuesto: g_superbloque->s_iroot[i] ? (hay que hacer a i variar).

Lo que dces es correcto, al poner inodos[FS_NUM_NODOS] estas deniendo un arreglo de struct inodo.
  #5 (permalink)  
Antiguo 06/08/2008, 17:13
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 10 meses
Puntos: 2
Respuesta: Problema al acceder a memoria

Supongo que también habrás asignado memoria para g_superbloque:

Código:
g_superbloque=(struct super_block*)malloc(sizeof(struct super_block));
y de paso, ¿Por qué el extern en la estructura inodo?

Código:
extern struct inodo { ...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:28.