【问题标题】:Why doesn't this function work? (Linked list)为什么这个功能不起作用? (链表)
【发布时间】:2017-07-24 19:22:37
【问题描述】:

有人可以帮我理解为什么这会给我带来分段错误吗?该函数应该在列表末尾添加 n。

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

void appendL (LInt *l, int n){
    LInt new=(LInt)malloc(sizeof(struct lligada));
    while ((*l) && (*l)->prox) l=&((*l)->prox);
    (*l)->prox=new;
    new->valor=n;
    new->prox=NULL;
}

【问题讨论】:

  • 现在是学习如何调试程序的好时机。请阅读How to Ask,并发布minimal reproducible example
  • 不要投malloc();不要在 typedef 后面隐藏指针。
  • struct lligada *head = NULL; appendL(&head, 42) 将崩溃。你明白为什么吗?
  • 这可能无关紧要,但我不会将你的变量命名为 new,即使在 C 中是合法的
  • new 是 C++ 中的运算符和大多数受 C 影响的语言中的关键字。这就是为什么它在这里突出显示为蓝色。可能没问题,但我想我会提醒你一下。

标签: c linked-list segmentation-fault singly-linked-list


【解决方案1】:

如果最初头节点等于NULL,那么这个statemenet

(*l)->prox=new;

给你分段错误。

更正确的函数定义可能如下所示

void appendL ( LInt *l, int n )
{
    LInt new = (LInt)malloc(sizeof(struct lligada));
    new->valor = n;
    new->prox = NULL;

    while ( *l != NULL ) l = &( *l )->prox;

    *l = new;
}

【讨论】:

  • @KevinDTimm new 这个词在 C 中不是关键字,但最好不要使用它,因为它是 C++ 中的关键字。至于铸造,那只是低素质程序员的建议,他们一个接一个地重复这种愚蠢。我已经对关于选角的答案投了反对票。
  • 是的,“不要投射 malloc”的不断重复是愚蠢的,但我不会称之为“错误”。这类似于告诉某人当他的真正问题是房子没有屋顶时不要使用单窗格窗户。没错,但完全无关紧要。
  • @KevinDTimm 请不要重复这种愚蠢的做法。所有编译器都报告缺少所需的标头。但是,如果不进行强制转换,您确实可以掩盖难以找到的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
  • 2013-06-09
相关资源
最近更新 更多