Ошибка сегментации в связанном списке - PullRequest
0 голосов
/ 27 марта 2019

Итак, у меня есть эти функции в моем файле imprimeL.c, который печатает каждое целое число l (* LInt), показывает ошибку сегмента на

(l -> prox) -> valor = 2 
(l -> prox) -> prox = NULL;

Моя функция imprimeL хорошо определена, и моя структура lligada:

typedef struct lligada {

    int valor;
    struct lligada *prox;

} *LInt;

void imprimeL(LInt l){

    LInt aux;

    while(l != NULL){

        printf("%d\n", l-> valor);
        aux = l-> prox;
        free(l);
        aux = NULL;
        l = aux;
    }

}

int main(){

    LInt l = malloc(sizeof(struct lligada));
    l -> valor = 1;
    (l -> prox) -> valor = 2;
    (l -> prox) -> prox = NULL;

    imprimeL(l);

    printf("Ola\n");
    return 0;
}

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Ошибка сегментации возникает при доступе к адресу памяти, к которому у вас нет доступа.В вашем случае, когда вы выделяете память для l, ваша структура данных lligada выглядит следующим образом:

int valor                -> some garbage value
struct lligada *prox;    -> NULL pointer

Итак, когда вы обращаетесь к l-> prox -> prox, вы пытаетесь получить доступ к нулевому указателю, который вызывает сегментациюошибка.

Чтобы избежать этого, вы можете выделить память для прокси перед доступом к его элементам.

0 голосов
/ 27 марта 2019

Возможно, вы захотите следующее:

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

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

void imprimeL(LInt l) {    
  LInt aux;

  while (l != NULL) {
    printf("%d\n", l->valor);
    aux = l->prox;
    free(l);
    l = aux;
  }    
}

int main() {    
  LInt l = malloc(sizeof(struct lligada));
  l->valor = 1;

  LInt l1 = malloc(sizeof(struct lligada));
  l->prox = l1;

  l1->valor = 2;
  l1->prox = NULL;

  imprimeL(l);

  printf("Ola\n");
  return 0;
}

Также есть ошибка в вашей функции imprimeL.

Следующим шагом для вас является динамическое создание связанного списка с помощью цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...