#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个值a
和b
写入列表。问题在于应用程序可能在此行(*l) -> data = a;
中出现分段错误。
我知道有很多与此类似的话题,但是无论如何我都无法解决我的问题。
答案 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,与两个级别的指针匹配,将需要更多的解释。
修复此问题中所述的段错误后,基于对链表的错误处理,您的代码将出现可预见的问题。请对这些问题另外提出一个问题,它们与此处讨论的指针类型的嵌套深度不匹配无关。