C 我能知道是什么导致了分割错误吗?
我想我已经在下面的代码中正确地实现了指针。但它会导致分割错误。有人能解释一下原因吗C 我能知道是什么导致了分割错误吗?,c,segmentation-fault,C,Segmentation Fault,我想我已经在下面的代码中正确地实现了指针。但它会导致分割错误。有人能解释一下原因吗 struct list { int index; struct list *next; }; void add(struct list *l,int index) { struct list *temp=l; if(l==NULL) { temp=(struct list *)malloc(sizeof(struct list)); temp
struct list
{
int index;
struct list *next;
};
void add(struct list *l,int index)
{
struct list *temp=l;
if(l==NULL)
{
temp=(struct list *)malloc(sizeof(struct list));
temp->index=index;
temp->next=NULL;
l=temp;
}
else
{
while(temp->next!=NULL)
temp=temp->next;
struct list *nnode=(struct list *)malloc(sizeof(struct list));
nnode->index=index;
nnode->next=NULL;
temp->next=nnode;
}
}
main()
{
struct list *l;
l=NULL;
int el;
scanf("%d",&el);
add(l,el);
while(l->next!=NULL) //It causes seg fault
{
printf(" %d ",l->index);
l=l->next;
}
}
如果只调用add一次,则此代码不应出错,但我假设您调用了其他函数并传递了仍然为
NULL的列表,您应该发送指向该列表指针的指针
void add(struct list **l,int index)
{
if(*l==NULL) {
*l=(struct list *) malloc(sizeof(struct list));
}
}
否则,当add返回时,它仍然是NULL
,因为您只初始化指针的一个副本,或者如果这造成混淆,您可以在main()
中初始化列表,并避免在add()
中初始化。如果只调用一次add,则此代码不应出错,但是我假设您调用其他函数并传递仍然为NULL的列表,您应该发送指向列表指针的指针
void add(struct list **l,int index)
{
if(*l==NULL) {
*l=(struct list *) malloc(sizeof(struct list));
}
}
否则,当add返回时,它仍然是NULL
,因为您只初始化指针的一个副本,或者如果这使您感到困惑,您可以在main()
中初始化列表,并避免在add()
中初始化此代码不会执行您认为它会执行的操作:
void add(struct list *l,int index)
{
struct list *temp=l;
if(l==NULL)
{
temp=(struct list *)malloc(sizeof(struct list));
temp->index=index;
temp->next=NULL;
l=temp;
}
...
参数l不会更改,因为您只是将其作为指针传递,为了更改l指向的对象,您需要传递l的地址
void add(struct list **l,int index)
{
struct list *temp;
if(*l==NULL)
{
temp=(struct list *)malloc(sizeof(struct list));
temp->index=index;
temp->next=NULL;
*l=temp;
}
...
否则更改将不会超出功能范围。此代码不会执行您认为的操作:
void add(struct list *l,int index)
{
struct list *temp=l;
if(l==NULL)
{
temp=(struct list *)malloc(sizeof(struct list));
temp->index=index;
temp->next=NULL;
l=temp;
}
...
参数l不会更改,因为您只是将其作为指针传递,为了更改l指向的对象,您需要传递l的地址
void add(struct list **l,int index)
{
struct list *temp;
if(*l==NULL)
{
temp=(struct list *)malloc(sizeof(struct list));
temp->index=index;
temp->next=NULL;
*l=temp;
}
...
否则更改将不会超出功能范围。代码中的缩进发生了什么?还有,什么是el
?@cnicutar是的!这只是整个代码的一部分。发布部分是可以的,但是如果它是一个独立的程序,并且您询问运行时错误,请确保您发布的内容实际上是先编译的。另外,请确保您发布的代码确实说明了您遇到的问题。您的代码在编译后不会出错。谢谢,您的代码现在演示了您所问的问题。代码中的缩进发生了什么?还有,什么是el
?@cnicutar是的!这只是整个代码的一部分。发布部分是可以的,但是如果它是一个独立的程序,并且您询问运行时错误,请确保您发布的内容实际上是先编译的。另外,请确保您发布的代码确实说明了您遇到的问题。您的代码在编译后不会出错。谢谢,您的代码现在演示了您正在询问的问题。使用单个级别指针,是什么导致它出错?即使现在,它也应该使用地址并将其值从NULL更改为NULL。否?@vivek_jonam否发送并初始化指针的副本,main中的指针仍然是“struct list*temp=l”中的NULL
;我理解的是,l的地址被发送到temp,因为l是指针。是不是错了?在“结构列表*temp=l”中,这里l的值即结构的地址被发送到temp。它错了吗?@vivek_jonam是的,有点,但是l
是NULL
所以temp是NULL
,然后你为本地指针l
分配内存,而不是使用main()
中的一个单级指针,这是怎么回事?即使现在,它也应该使用地址并将其值从NULL更改为NULL。否?@vivek_jonam否发送并初始化指针的副本,main中的指针仍然是“struct list*temp=l”中的NULL
;我理解的是,l的地址被发送到temp,因为l是指针。是不是错了?在“结构列表*temp=l”中,这里l的值即结构的地址被发送到temp。它错了吗?@vivek_jonam是的,有点,但是l
是NULL
所以temp是NULL
,然后你为本地指针l
分配内存,并使用它,但不使用main()
中的指针,但有问题的是,l被声明为指针,它的地址被发送到add。这应该与地址相符。否?想象一下,如果您编写一个函数foo(inta),并将a设置为函数中的一个值,那么在您离开函数时,a不会发生更改。如果你写foo(int*a),你可以改变a所指向的值,但不能改变它所指向的值,这需要另一个间接层次,这是可以的。。但在“struct list*temp=l”中,l的值即struct的地址被发送到temp。它错了吗?temp将被设置为指向l指向的同一个对象,但您想要实现的是更改l指向的对象,即新分配的结构。但有疑问的是,l被声明为指针,其地址被发送到add。这应该与地址相符。否?想象一下,如果您编写一个函数foo(inta),并将a设置为函数中的一个值,那么在您离开函数时,a不会发生更改。如果你写foo(int*a),你可以改变a所指向的值,但不能改变它所指向的值,这需要另一个间接层次,这是可以的。。但在“struct list*temp=l”中,l的值即struct的地址被发送到temp。错误吗?temp将被设置为指向l指向的同一个对象,但您想要实现的是更改l指向的对象,即新分配的结构。