分配值时链表的分段错误 #包括 #包括 类型定义结构节点{ 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。这更像是“我相信你,我真的应该在那里写……哎哟!哎哟!哎哟!”读