断言`l!= NULL'列表失败了

时间:2017-03-09 14:28:28

标签: c list struct assert

我在C中实现了一个链式列表结构,但是我得到了一个断言错误:断言`l!= NULL'失败了。然而,我并不认为拥有它。

这是我的结构:

typedef struct list list;
struct list{
  element * elt;
  list * next;
};

这是我的添加方法:

int add(char* user, list*l){
  if(l==NULL){
    printf("NULL %s\n", user);
    l=malloc(sizeof(list));
    l->elt=malloc(sizeof(element));
    (l->elt)->username=malloc(sizeof(char)*256);
    strcpy((l->elt)->username,user);
    (l->elt)->score=0;
    return 1;
  }
  else{
    printf("not NULL %s\n", user);
    return add(user,l->next);
  }
}

这是主要的:

int main(){
  list * l ;
  assert(l==NULL);
  printf("%d\n", add("hello",l));
  assert(l!=NULL);
  return 1;
}

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

您需要将指针传递给列表指针,以便在函数中更改它的内容。

int add(char* user, list**l){
  if((*l)==NULL){
    printf("NULL %s\n", user);
    (*l)=malloc(sizeof(list));
    (*l)->elt=malloc(sizeof(element));
    ((*l)->elt)->username=malloc(sizeof(char)*256);
    strcpy(((*l)->elt)->username,user);
    ((*l)->elt)->score=0;
    return 1;
  }
  else{
    printf("not NULL %s\n", user);
    return add(user,&((*l)->next));
  }
}

和函数调用必须类似

  list *l = NULL; //pointer is allocated, points to nothing for now
  printf("%d\n", add("hello",&l));

答案 1 :(得分:1)

您应该将l的地址传递给函数add。 另外我看到你没有初始化局部变量。第一个断言不是必需的。 像这样调用你的函数: printf("%d\n", add("hello",&l));

更改功能原型 到int add(char* user, list**l)并相应地修改你的功能。