分配值时链表的分段错误 #包括 #包括 类型定义结构节点{ int数据; 结构节点*下一步; }节点; typedef节点*列表; 内部主(空){ 列表*l; INTA=2; int b=12; l=malloc(sizeof(Node)); (*l)->数据=a; printf(“%d\n”,(*l)->数据); (*l)=(*l)->下一步; l=malloc(sizeof(Node)); (*l)->数据=b; printf(“%d\n”,(*l)->数据); (*l)=(*l)->下一步; (*l)=空; }

分配值时链表的分段错误 #包括 #包括 类型定义结构节点{ int数据; 结构节点*下一步; }节点; typedef节点*列表; 内部主(空){ 列表*l; INTA=2; int b=12; l=malloc(sizeof(Node)); (*l)->数据=a; printf(“%d\n”,(*l)->数据); (*l)=(*l)->下一步; l=malloc(sizeof(Node)); (*l)->数据=b; printf(“%d\n”,(*l)->数据); (*l)=(*l)->下一步; (*l)=空; },c,linked-list,C,Linked List,嗨,伙计们! 我正在用链表编写一个简单的代码,我的目标是在列表中写入两个值a和b。问题是应用程序可能在这一行出现分段错误(*l)->data=a。 我知道有很多类似的话题,但无论如何我无法解决我的问题。之后 #include<stdio.h> #include<stdlib.h> typedef struct node { int data; struct node * next ; }Node ; typedef Node * List ; i

嗨,伙计们! 我正在用链表编写一个简单的代码,我的目标是在列表中写入两个值
a
b
。问题是应用程序可能在这一行出现分段错误
(*l)->data=a。
我知道有很多类似的话题,但无论如何我无法解决我的问题。

之后

#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;

}
指针
l
接收到节点大小为
的某物的地址

这将取消对指针的引用两次,即它使用指向的内容作为指针,取消对它的引用并访问谁知道在哪里,这将触发SEGFULT(如果幸运的话)

一次就足够了:

(*l) -> data = a;

这将修复故障

但是,
l
被声明为指向-(typedefhidden pointer to Node)的指针。
该声明两次匹配解引用

为了解决这个问题,我建议将
l
声明为指向
节点的非隐藏指针

(*l).data = a;
据我所知,这应该适用于代码目的

或者声明为指向
节点的隐藏指针
,即声明为
列表

Node *l;
对于未提及的需求,您可能实际上需要一个双指针。
但在这种情况下,请提出一个单独的问题,并用代码说明这种需要。它将对两个层次的mallocing进行更多的解释,与两个层次的指针相匹配

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

#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;

}
指针
l
接收到节点大小为
的某物的地址

这将取消对指针的引用两次,即它使用指向的内容作为指针,取消对它的引用并访问谁知道在哪里,这将触发SEGFULT(如果幸运的话)

一次就足够了:

(*l) -> data = a;

这将修复故障

但是,
l
被声明为指向-(typedefhidden pointer to Node)的指针。
该声明两次匹配解引用

为了解决这个问题,我建议将
l
声明为指向
节点的非隐藏指针

(*l).data = a;
据我所知,这应该适用于代码目的

或者声明为指向
节点的隐藏指针
,即声明为
列表

Node *l;
对于未提及的需求,您可能实际上需要一个双指针。
但在这种情况下,请提出一个单独的问题,并用代码说明这种需要。它将对两个层次的mallocing进行更多的解释,与两个层次的指针相匹配


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

因此,本质上,当指针尝试访问(*l)->数据时,它不知道数据在哪里,因此导致分段错误?我试着用你建议的那一行来替换那一行,但我甚至不能编译它。编译以什么方式失败?什么错误消息?@Lethal编辑得很好。感谢您的正确阅读。如果我写“l->data=a”,它告诉“表达式必须有指向结构或联合类型的指针”。如果我写“(*l).data->a”,它告诉“表达式必须有结构或联合类型”,这不是因为不知道在哪里而导致segfult。它更像是“我相信你,我真的应该在那里写…”。。。哎哟哎哟哎哟“。因此,当指针尝试访问(*l)->数据时,它根本不知道它在哪里,因此导致了分段错误?我尝试用您建议的行替换该行,但我甚至无法编译它。编译以何种方式失败?什么错误消息?@LethalProgrammer Nice edit。感谢您的正确阅读。如果我编写”l->data=it-tells表达式必须有指向结构或联合类型的指针)。如果我写“(*l).data->a”,它告诉“expressione必须具有结构或联合类型”,这不是因为不知道在哪里导致segfault。这更像是“我相信你,我真的应该在那里写……哎哟!哎哟!哎哟!”读