我分配值时链表的细分错误

时间:2018-08-18 08:13:11

标签: c linked-list

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



typedef struct node {
    int data;
    struct node * next ;
}Node ;

typedef Node * List ;

int main(void){

    List *l;
    int a = 2;
    int b =12;
    l = malloc(sizeof(Node));
    (*l) -> data = a;
    printf("%d\n", (*l)->data);
    (*l) = (*l)->next;
    l = malloc(sizeof(Node));
    (*l) -> data = b;
    printf("%d\n", (*l) ->data);
    (*l) = (*l)->next;
    (*l) = NULL;

}

大家好! 我正在用链接列表编写一个简单的代码,我的目标是将列表中的2个值ab写入列表。问题在于应用程序可能在此行(*l) -> data = a;中出现分段错误。 我知道有很多与此类似的话题,但是无论如何我都无法解决我的问题。

1 个答案:

答案 0 :(得分:3)

此后

l = malloc(sizeof(Node));

指针l收到的地址大小为Node

这两次取消了对指针的引用,即它使用指向的内容作为指针,对其进行了取消引用并访问who-knows-where,从而触发了段错误(如果幸运的话)。

(*l) -> data = a;

一次就够了

l -> data = a;

(*l).data = a;

这将修复段错误。

但是,l被声明为指向(指向节点的typedefhidden-pointer的指针)。
该声明匹配两次取消引用。

为进行清理,我建议将l声明为指向Node的非隐藏指针。

Node *l;

据我所知,这应该适合代码用途。

或声明为指向Node的隐藏指针,即声明为List

List l;

也许您实际上需要一个双指针来满足未提及的要求。
但是在这种情况下,请使用一个说明该需求的代码提出一个单独的问题。关于两个级别的malloc,与两个级别的指针匹配,将需要更多的解释。

修复此问题中所述的段错误后,基于对链表的错误处理,您的代码将出现可预见的问题。请对这些问题另外提出一个问题,它们与此处讨论的指针类型的嵌套深度不匹配无关。