es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Violación de segmento utilizando múltiples estructuras.

Soy algo nuevo en C. Estoy teniendo algunos problemas usando punteros y cosas así.

Hice este trozo de código para tratar de entender por qué me devuelve Segmentation Fault.

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

typedef struct lligada {
    int userID;
    struct lligada *prox;
} *LInt;

typedef struct {
    int repo_id;
    LInt users;
} Repo;

typedef struct nodo_repo {
    Repo repo;
    struct nodo_repo *left;
    struct nodo_repo *right;
} *ABin_Repos;

void createList (int id_user, int id_repo) {
    ABin_Repos temp = malloc(sizeof(struct nodo_repo));

    temp->repo.repo_id = id_repo;
    temp->repo.users->userID = id_user;

    temp->left = NULL;
    temp->right = NULL;

    printf("%d", temp->repo.users->userID);
}

int main() {
    int id_user, id_repo;

    scanf("%d %d", &id_user, &id_repo);

    createList(id_user, id_repo);

    return 0;
}

Realmente no entiendo.
Disculpa si esta es una pregunta tonta.

¡Gracias!</string.h></stdlib.h></stdio.h>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    ¡Hola! Es genial que estés tratando de aprender C y hacer preguntas definitivamente no es algo estúpido.

    Entonces, la razón por la cual tu código te está dando un error de Segmentation Fault es por la forma en que estás intentando acceder al campo userID en el campo users de la estructura Repo del struct. Permíteme explicarte:

    En tu función createList(), creas un nuevo objeto ABin_Repos llamado temp, el cual es un puntero a una estructura que contiene otra estructura, Repo, y dos punteros más a estructuras ABin_Repos.

    Luego, estableces temp->repo.repo_id con el valor de id_repo, lo cual está bien.

    A continuación, intentas establecer temp->repo.users->userID con el valor de id_user. Sin embargo, temp->repo.users está sin inicializar en este punto, por lo que apunta a alguna ubicación aleatoria en memoria. Cuando intentas acceder a userID a través de él, obtienes un error de Segmentation Fault porque estás intentando leer o escribir en memoria a la que no tienes permitido acceder.

    Para solucionar este problema, necesitas asignar memoria para temp->repo.users antes de poder acceder a sus campos. Una forma de hacer esto es agregando una línea como esta después de establecer repo_id:

    temp->repo.users = malloc(sizeof(struct lligada));
    

    Esto crea un nuevo objeto LInt al que apunta temp->repo.users, y luego puedes acceder y modificar sin causar un Segmentation Fault.

    ¡Espero que esto ayude! Avísame si tienes alguna otra pregunta.

Comments are closed.