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

时间:2017-04-10 11:14:47

标签: c list function pointers linked-list

我正在尝试用列表做一个简单的作业,我想编写一个函数:

  1. 接收指向列表头部和整数
  2. 的双指针
  3. 检查头部是否指向某物或NULL
  4. 如果头部指向NULL,则将其重新分配给包含新节点的新内存位置[等等]
  5. 如果不为null,只需将新节点添加到列表底部
  6. 即可

    但是当我的代码检查头列表是否为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 is 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 个答案:

答案 0 :(得分:2)

这就是你应该编译警告的原因。这是你做的:

InserList(head, tempnum);

您传递的t_node *预计会t_node **。那些是不兼容的指针类型。因此,您的程序具有未定义的行为。

修复

InserList(&head, tempnum);

然后给你的编译器提供高级警告标志并修复你的代码,直到它没有警告。