断言 ‘l !=NULL’ 因 List 而失败

Assertion ` l !=NULL' failed with List

我正在用 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;
}

在此先感谢您的帮助。

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

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));

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

更改函数原型 int add(char* user, list**l) 并相应地修改您的函数。