我试图实现循环队列功能。我是一个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 值(按值传递指针)。有人可以帮我指出我哪里出错吗?
由于
答案 0 :(得分:5)
您永远不会在a
函数中初始化变量main
,因此其内容为 indeterminate ,并且使用该结构的成员将导致未定义的行为< / em>的
答案 1 :(得分:3)
您的代码有两个问题,第一个更严重。
您的第一个问题是,您的CLlist结构的head
和tail
成员未初始化为NULL
,这可能(非确定性地)保存任何实际数据在你的结构中。这可以通过在第一次main
来电之前的insert
中添加以下两行来解决:
l->head = NULL;
l->tail = NULL;
你的第二个问题就在这一行:
if((l->head==l->tail)==NULL)
虽然看起来这是将l->head
和l->tail
与NULL
进行比较,但它实际上是将l->head
与l->tail
进行比较,然后将该布尔结果与NULL
进行比较,实际上是0
。该行应更改为:
if((l->head == NULL) && (l->tail == NULL))
这将分别测试head
和tail
指针,如果它们都是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;