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>
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 campousers
de la estructuraRepo
del struct. Permíteme explicarte:En tu función
createList()
, creas un nuevo objetoABin_Repos
llamadotemp
, el cual es un puntero a una estructura que contiene otra estructura,Repo
, y dos punteros más a estructurasABin_Repos
.Luego, estableces
temp->repo.repo_id
con el valor deid_repo
, lo cual está bien.A continuación, intentas establecer
temp->repo.users->userID
con el valor deid_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 auserID
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 establecerrepo_id
:Esto crea un nuevo objeto
LInt
al que apuntatemp->repo.users
, y luego puedes acceder y modificar sin causar un Segmentation Fault.¡Espero que esto ayude! Avísame si tienes alguna otra pregunta.