为什么我不能在if语句中使用空指针?

问题描述:

我试图做列出了简单的功课,我想编写一个函数:如果头是指向为什么我不能在if语句中使用空指针?

  1. 接收双指针链表的头和一个整数
  2. 检查某事或NULL
  3. 如果头指向NULL,然后将其重新分配到新的存储位置包含我的新节点[等]
  4. 如果不为空,只需添加新节点列表的底部

但是,当我的代码检查头列表是否为NULL时,我收到“读访问内存违规” 这是我的代码:

void InserList(t_node** lis, int x) { 
    t_node* temp; 
    temp = malloc(sizeof(t_node)); 
    temp->num = x; 
    if (*lis == NULL) { 
     temp->next = NULL; 
     *lis = temp; 
    } 
    else { 
     temp = *lis; 
     while (temp->next != NULL) { 
      temp = temp->next; 
     } 
     temp->next = malloc(sizeof(t_node)); 
     temp->next->num = x; 
     temp->next->next = NULL; 
    } 
} 

我的代码运行没有问题,直到它必须这样做:

if (*lis == NULL) { 
     ... 
} 

给我一个错误 “LIS是nullptr”。 我的想法错了吗?我应该如何解决这个功能?

谢谢

编辑:这是最主要的功能

int main(void) { 
    int elements; 
    int count; 
    int tempnum; 
    t_node *head, *second_head; 
    head = second_head = NULL; 
    t_node **ref_head, **ref_second_head; 
    ref_head = &head; 
    ref_second_head = &second_head; 
    scanf("%d", &elements); 
    for (count = 0; count != elements; count++) { 
     scanf("%d", &tempnum); 
     InserList(head, tempnum); 
     if (IsPrimo(tempnum) == false) { 
      InserList(second_head, tempnum); 
     } 
    } 
    PrintList(second_head); 
} 
+1

你是怎么称呼'InserList'的?这就是'lis'的来源,毕竟 – StoryTeller

+1

'if(lis == NULL)'不需要取消引用(取决于你如何管理它) – BlackBear

+1

'lis'本身就是一个指针,为什么不先检查它呢? –

这就是为什么你应该有警告编译。这里就是你要做的:

InserList(head, tempnum); 

你传递一个t_node *其中t_node **预期。这些是不兼容的指针类型。您的程序因此具有未定义的行为。

修复是:

InserList(&head, tempnum); 

然后给你的编译器高水平的警告标志和修复您的代码,直到它没有警告的。

+0

谢谢,我也意识到我做了“ref_head “和”ref_second_head“只是为了这个,但我没有使用它们,我是一个白痴。 再次感谢你 – RaiN