尝试延迟指针时的分段错误:C

时间:2016-04-24 03:37:02

标签: c pointers

我试图实现循环队列功能。我是一个C ++编码器,我发现令人惊讶的是,在C中,struct不能有成员函数。无论如何,这是我的实施: -

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



struct node
{
    int nvalue;
    struct node *next;
};

struct CLlist
{
    struct node* head;
    struct node* tail;
    int size;
};

void insert(struct CLlist *l,int num)
{
    struct node *n=malloc(sizeof(struct node));
    n->nvalue=num;
    n->next=NULL;

    if((l->head==l->tail)==NULL)
    {
        l->head=l->tail=n;
    }
    else if(l->head==l->tail && l->head!=NULL)
    {
        l->head->next=n;
        l->tail=n;
        l->tail->next=l->head;
    }
    else
    {
        l->tail->next=n;
        l->tail=n;
        l->tail->next=l->head;
    }
    l->size++;
}

void print(struct CLlist *l)
{
    int idno=1;
    printf("printing the linked list with size as %d\n",l->size);
    struct node *cptr;
    for(cptr=(l->head);cptr!=(l->tail);cptr=cptr->next)
    {
        printf("The idno is %d and the number is %d\n",idno,cptr->nvalue);
        idno++;
    }
    //this is to print the last node in circular list : the tail node
    idno++;
    cptr=cptr->next;
    printf("The idno is %d and the number is %d\n",idno,cptr->nvalue);
}


int main()
{
    struct CLlist a;
    struct CLlist *l;
    l=&a;

    insert(l,2);
    insert(l,5);
    insert(l,7);
    insert(l,10);
    insert(l,12);
    print(l);


    return 0;
}

我在行

中遇到分段错误

printf(“idno是%d,数字是%d \ n”,idno,cptr-&gt; nvalue);

为什么会出现错误?我想我没有正确地通过指针传递l 值(按值传递指针)。有人可以帮我指出我哪里出错吗?

由于

3 个答案:

答案 0 :(得分:5)

您永远不会在a函数中初始化变量main,因此其内容为 indeterminate ,并且使用该结构的成员将导致未定义的行为< / em>的

答案 1 :(得分:3)

您的代码有两个问题,第一个更严重。

您的第一个问题是,您的CLlist结构的headtail成员未初始化为NULL,这可能(非确定性地)保存任何实际数据在你的结构中。这可以通过在第一次main来电之前的insert中添加以下两行来解决:

l->head = NULL;
l->tail = NULL;

你的第二个问题就在这一行:

if((l->head==l->tail)==NULL)

虽然看起来这是将l->headl->tailNULL进行比较,但它实际上是将l->headl->tail进行比较,然后将该布尔结果与NULL进行比较,实际上是0。该行应更改为:

if((l->head == NULL) && (l->tail == NULL))

这将分别测试headtail指针,如果它们都是NULL,则只接受该分支。

答案 2 :(得分:1)

你有一个指针

struct node *cptr;
// You're probably trying to access an unassigned pointer head in the next step
for(cptr=(l->head);cptr!=(l->tail);cptr=cptr->next)

根据标准,没有要求

a->head&amp; a->tail已初始化为NULL

当你做的时候

struct CLlist a;

标准ISO / IEC 9899:201x条款6.7.9-> 10州

  

如果未初始化具有自动存储持续时间的对象   显然,它的价值是不确定的。

事实上你是:

struct CLlist a;
// missing something here.
struct CLlist *l;
l=&a;