puntero a punteros en c
-
27-10-2019 - |
Pregunta
Necesito ayuda con los punteros en C. Tengo dos estructuras una estructura hecha como esta:
typedef struct s{
s2** d;
struct s* next;
}s;
typedef struct s2{
c* fi;
struct s2* next;
}s2;
Y tengo una función como esta:
void modify(c* a, s2* b){ //c* is a pointer to a struct
s* rd = malloc(sizeof(s);
rd->next = NULL;
//need also to initialize the field "d" of the "s" struct
}
Esto es un error generador. Necesito que la estructura rd apunte a B como en el ejemplo. Necesito almacenar un puntero doble porque S2 está vinculado de manera similar a la lista, por lo que necesito el puntero ** para tener la posibilidad de eliminar el primer elemento de la lista. Estaba haciendo la tarea en el comentario como rd-> d = & b, pero cuando trato de deferencia del campo "d" en una función tengo una lectura de memoria no válida y no puedo entender por qué.
Solución
Supongo que el problema es este:
Pasas s2* b
como argumento a modify
, así, este puntero reside en la pila. Ahora cuando asignas rd->d = &b
, tomas esa ubicación en la pila, que solo será válida hasta que la ejecución deja el alcance de modify
. Así, cuando la desreferencia rd->d
Más tarde, accedes a esa ubicación (ahora inválida) en la pila, que produce basura o un choque. (Sin embargo, en este escenario, deberías poder desreferencia rd->d
correctamente mientras todavía está modify
.)
Probablemente querrías alterar cómo b
se pasa a modificar, muy probablemente en algo como s2** b
, para que pueda pasar correctamente un puntero a un puntero a s2
en otra estructura, en lugar de convertirlo en un puntero a s2
sentado en la pila para modify
.
Básicamente como esto:
void modify(c* a, s2** b) {
s* rd = malloc(sizeof(s));
rd->next = NULL;
rd->d = b;
}
y llámalo como
s2* myS2 = ...;
modify(<whatever>, &myS2->next);
Esto debería permitirle pasar la ubicación de un puntero a un s2
instancia que puede almacenar y desreferencia incluso después modify
Termina (sin probarse).