链表上的分段错误

时间:2019-03-27 16:03:50

标签: c

所以,我在imprimeL.c文件中有此功能,该文件打印l(* LInt)的每个整数,它显示段错误

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

我的imprimeL函数定义明确,我的ligligada结构是:

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 个答案:

答案 0 :(得分:1)

当您访问您无权访问的内存地址时,就会发生分段错误。在您为l分配内存的情况下,您的lligada数据结构如下:

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

因此,当您访问l-> prox-> prox时,您尝试访问的是导致段错误的空指针。

为避免这种情况,您可以在访问代理元素之前为其分配内存。

答案 1 :(得分:0)

您可能想要这样:

#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函数中还有一个错误。

下一步是使用循环动态创建链接列表。