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é.

¿Fue útil?

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top