首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么不删除将指针设置为NULL?

在C++或C语言中,将指针设置为NULL(或者在C++11中使用nullptr)是一种很常见的做法。这是因为将指针设置为NULL可以避免悬空指针的出现,并有助于防止因为使用未初始化或已释放的指针而导致的程序错误。

悬空指针是指一个指针指向的对象已经被释放,但指针本身并没有被设置为NULL。这样的指针被称为悬空指针,它可能导致程序错误,因为它试图访问一个已经不存在的对象。将指针设置为NULL可以避免这种情况的发生。

此外,将指针设置为NULL还可以帮助代码的可读性和可维护性。当其他开发人员看到一个指针被设置为NULL时,他们可以清楚地知道该指针目前没有指向任何对象。这也有助于防止因为误解指针的指向而导致的程序错误。

总之,将指针设置为NULL是一种良好的编程习惯,可以帮助避免程序错误并提高代码的可读性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么 MySQL 推荐默认值 null

NULL值是一种对列的特殊约束,我们创建一个新列时,如果没有明确的使用关键字not null声明该数据列,MySQL会默认的我们添加上NULL约束。...有些开发人员在创建数据表时,由于懒惰直接使用Mysql的默认推荐设置.(即允许字段使用NULL值).而这一陋习很容易在使用NULL的场景中得出不确定的查询结果以及引起数据库性能的下降。...IS NULL IS NOT NULL 太空船操作符,这个操作符很像=,select NULLNULL可以返回true,但是select NULL=NULL返回false....虽然select NULL=NULL的结果false,但是在我们使用distinct,group by,order by时,NULL又被认为是相同值. 1 (root@localhost mysql3306...根据以上缺点,我们并不推荐在列中设置NULL作为列的默认值,你可以使用NOT NULL消除默认设置,使用0或者''空字符串来代替NULL。 ---- ----

3.9K20

为什么 MySQL 推荐默认值 null

NULL值是一种对列的特殊约束,我们创建一个新列时,如果没有明确的使用关键字not null声明该数据列,MySQL会默认的我们添加上NULL约束。...有些开发人员在创建数据表时,由于懒惰直接使用Mysql的默认推荐设置.(即允许字段使用NULL值).而这一陋习很容易在使用NULL的场景中得出不确定的查询结果以及引起数据库性能的下降。...IS NULL IS NOT NULL 太空船操作符,这个操作符很像=,select NULLNULL可以返回true,但是select NULL=NULL返回false....虽然select NULL=NULL的结果false,但是在我们使用distinct,group by,order by时,NULL又被认为是相同值. 1 (root@localhost mysql3306...根据以上缺点,我们并不推荐在列中设置NULL作为列的默认值,你可以使用NOT NULL消除默认设置,使用0或者''空字符串来代替NULL

4.8K30
  • DS:带头双向循环链表的实现

    1.3 循环或者循环 循环的链表最后一个结点的next指针指向NULL,而循环的链表,最后一个结点的next指针指向第一个结点!!...phead->prev = newnode;//哨兵结点的前驱指针指向新结点 } 单链表中我们的参数选择二级指针为什么这里选择一级指针???...phead->next = newnode;//头节点的后继指针指向新节点 } 4.5 打印 因为是循环链表,所以为了避免死循环打印,我们要设置一个指针接收头节点的下一个结点,然后往后遍历...同时要注意一条规则,就是当链表中只有哨兵结点的时候,我们称该链表空链表!因此如果链表只存在哨兵结点,那么删除是没有意义的,所以必须断言!...} 为什么phead=NULL没有用??

    11710

    数据结构-队列

    队列是只允许在一端插入另一端删除的线性表,即一种先入先出(FIFO)的结构,队列有顺序对列与循环队列,循环队列主要是为了弥补队列存储空间不足与“假溢出”的问题,所以在实际应用时,往往使用的是循环队列,下面我们从头说下为什么会有循环队列这个东西...这个问题解决了,顺序链表的形式也就确定了,那么为什么还会有循环链表? ?...*/ return OK; } /* 若队列空,则删除Q中队头元素,用e返回其值 */ Status DeQueue(SqQueue *Q,QElemType *e) { if...e的新结点s赋值给原队尾结点的后继,见图中① */ Q->rear=s; /* 把当前的s设置队尾结点,rear指向s,见图中② */ return OK; } /* 若队列空...② */ if(Q->rear==p) /* 若队头就是队尾,则删除rear指向头结点,见图中③ */ Q->rear=Q->front; free(p);

    56760

    DS:单链表实现队列

    2、为什么我要在队列结构体里设置一个size,设置可以吗??    ...其实设置size也是可以的,有些书上也没有设置size,我设置size也是考虑到2个原因: 1、栈有结构体成员top,而队列没有 栈中的top其实跟顺序表中的有效数据个数基本上差异不大,虽然名字是不一样的...必须不能是NULL,因此要分开讨论ptailNULL的情况 2.3.3 为什么assert(pq->phead == NULL)      因为我们考虑ptail空的时候,不能用成员next,但是因为按道理来说一般情况下...ptail成为一个野指针,所以我们需要考虑只有一个节点多个节点的情况 if (pq->phead->next == NULL)//一个节点的情况,直接这个节点释放并置空即可 { free(pq...ptail成为一个野指针,所以我们需要考虑只有一个节点多个节点的情况 if (pq->phead->next == NULL)//一个节点的情况,直接这个节点释放并置空即可 { free(pq

    14610

    链接未来:深入理解链表数据结构(一.c语言实现无头单向非循环链表)

    通过遍历找到最后一个节点(tail),并将其 next 指针指向新节点 newNode,以新节点插入到链表的末尾 为什么传入二级指针: 这种设计方式的原因在于需要修改指针本身的值,而不是只修改指针所指向的内容...),然后当前头节点的 next 指针指向新节点 newNode,以完成插入 注释部分显示了另一种写法,通过先设置新节点的 next 指针指向当前头节点,然后再将链表的头指针指向新节点,实现了同样的插入操作...*pphead 是否存在(不为 NULL),以及链表是否空(只有一个节点) ​ 如果链表中只有一个节点,则直接释放该节点,并将链表头指针设置 NULL,表示链表空 如果链表中有多个节点,则会找到倒数第二个节点...它通过遍历链表直到找到倒数第二个节点 pre_tail,然后释放最后一个节点,并将倒数第二个节点的 next 指针设置 NULL,表示该节点成为新的末尾节点 3.5头删 void SLPopFront...这是因为要删除的是链表的头节点,为了不断开链表,需要先保存第二个节点的地址 通过 free(*pphead) 释放掉原来的头节点,然后链表的头指针 *pphead 更新原头节点的下一个节点 first

    14010

    SkipList和java中ConcurrentSkipListMap的实现

    现在需要删除节点n。 第一步,使用CASn的valu的值从non-null设置null。这个时候,任何外部的操作都会认为这个节点是不存在的。...但是那些内部的插入或者删除操作还是会继续修改n的next指针。 第二步,使用CASn的next指针指向一个新的marker节点,从这个时候开始,n的next指针将不会指向任何其他的节点。...this; this.next = next; } 我们可以看到marker节点实际上是一个keynull,value是自己的节点。...第三步,使用CASb的next指针指向f。从这一步起,n节点不会再被其他的程序访问,这意味着n可以被垃圾回收了。...我们思考一下为什么要插入一个marker节点,这是因为我们在删除的时候,需要告诉所有的线程,节点n准备被删除了,因为n本来就指向f节点,这个时候需要一个中间节点来表示这个准备删除的状态。

    51720

    【初阶数据结构】详解栈和队列(来自知识星空的一抹流光)

    如果你没有猜到,没关系,听我给你解释一下是为什么。 我们可以知道的一个信息就是:队列只能在一端进行插入操作,在另一端进行删除操作。...我在之前说过,实现队列的插入或者删除操作时,只要我们能够合理的控制头节点和尾节点的指针,就足以能够实现队列。那此时,我们就要想一下,能不能有个更简单的方式,一起控制着头指针和尾指针。...方法就是:头节点的指针和尾节点的指针用一个结构体给打包起来,只要我们使用头节点和尾节点的指针时,就不要额外再定义其它变量了。...如果你这样做的话,你再给函数传递参数时,你就得往函数里面多传递两个参数或者是每当进行删除或插入数据时,我们都得先定义两个变量分别代表头节点和尾节点,十分的繁琐!...如果觉得本文的还不错的话,麻烦给偶点个赞吧!!!

    15110

    Android双端队列——ArrayDeque的实现&源码分析

    Arrays.fill(elements, null);//原数组清空 elements = a;//扩容后的数组赋给elements head = 0;//设置head...0 tail = n;//设置tail扩容前的数组大小,作为指针起点 } 逻辑解析: 计算出head指针右侧元素个数,之后需要使用它来进行数据复制。...原数组元素都置位null新数组赋给elements。 设置head的值0,tail的值原数组的大小n。这时,新数组的[0~n)指针位均已存储元素。...如果result不为nullelements[t]置位null,并且t赋值给tail指针。 最后返回result变量。...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站立刻删除

    82020

    数据结构初步(五)- 线性表之单链表的分析与C语言实现

    这种情况函数只需要知道外部头指针phead的值副本即可。 综合考虑这个函数参数设置SLNode** pphead,接受外部头指针的地址。...函数需要得到外部头指针的地址&phead,即二级结构体指针SLNode** pphead。 这个函数参数设置SLNode** pphead,接受外部头指针的地址。...接口函数函数可以不进行操作而直接返回;也可以对头指针NULL进行断言assert(),只有当头指针phead不为NULL时才继续删除操作。...接口函数函数可以不进行操作而直接返回(柔和检查);也可以对头指针NULL进行断言assert()(暴力检查),只有当头指针phead不为NULL时才继续删除操作。...链表中只有一个节点,删除此节点之后链表空,及时释放free()被删除节点空间,外部头指针phead此时需要改变指向(值),需要使其指向NULL;所以此情况我们需要二级结构体指针pphead接受外部头指针

    84010

    数据结构—线性表

    为什么会出现这种移动和删除某一元素时都需要移动大量的元素,是因为相邻两元素的存储位置也是具有相邻关系,他们在内存中的位置也是挨着的,中间没有空虚,不能直接进行插入,要想进行插入,需要先把其他元素进行挪动...头指针始终不等于NULL(指针是指指向下一个元素的的信息,当NULL时,即指向任何元素),head->next等于NULL的时候,链表空。...不带头结点的单链表中的头指针head直接指向开始结点,当head等于NULL(head->=NULL)的时候,链表空。...链表中整个链表的存取就必须从头指针开始进行,之后的每个结点就是上一个结点的后继指针指向的位置,最后一个结点(终端结点)的指针空,通常用NULL或^表示。...//直到r指针指向NULL } 2.查找结点的算法 在双链表中查找值x的结点,如果找到,则返回该结点的指针,否则返回NULL值。

    69430

    java队列

    为什么直接使用顺序表作为底层容器,因为入队操作执行顺序表尾插入,时间复杂度O(1) O(1) 普通语句,相互操作,时间复杂度O(1) 出对操作执行表头删除操作,时间复杂度O(n),因为涉及到一个循环遍历...,移动,由于时间复杂度高,此时直接想方法时间复杂度降低O(1) ,即,用双指针解决。...即front和rear两个解决 时间复杂度 O(n) 涉及一层循环,此时时间复杂度O(n) 又因为直接更改下标,会导致空间的浪费,(出队操作)此时,为了减少空间的浪费,队列设计循环队列,目的,避免假满现象的出现...,将会抛出错误,不会自动扩充 boolean offer(T data); // 返回队头元素,执行删除操作,空 返回null T peek(); // 返回队头元素,如果空,将会抛出异常...T element(); // 出队,执行删除操作,若为空,返回null T poll(); // 出队,执行删除操作,若为空,抛出异常 T remove(); // 清空队列 void

    98300

    单例模式

    当定义一个对象时,比如MyCAS mycas;,编译器会自动在栈上这个对象分配内存,并在离开当前作用域时自动释放这个内存。所以,我们不需要(也不能)手动删除这个对象。...我们将它初始化为NULL,表示这个指针目前指向任何东西。...这里有个小坑,记得C++中小写的null是没有意义的 总的来说,MyCAS* MyCAS::m_instance = NULL;写在类外面是C++语言规则的要求。...那紧接着,就会问,那为什么GetInstance()函数定义写在类外面呢,它写在类里不会报错,毕竟它也是static 在C++中,成员函数(包括静态和非静态)的声明通常在类的定义中进行,而定义(也就是函数体的实现...反序列化是序列化的数据恢复对象的过程。通常,反序列化函数会根据序列化数据创建一个新的对象,并将其状态设置序列化时的状态。 实际应用发现还是有缺点的,比如类里有指针的时候就不好搞了

    6910

    【数据结构】——单链表超详细介绍(小白必看!!!)

    一个个结点串成了链表,如下图所示: 有人可能会有疑问,不是说链表只是在逻辑结构上是连续的,在物理存储结构上是连续的,那为什么上图中一个个结点明明是挨在一起的,那么它在物理存储结构上肯定是连续的呀,其实不然...2.3 单链表尾插 注意:在创建结点时,已经让 结点.next=NULL,所以不需要在插入完结点后,再让新结点的next指针NULL。...有人可能会有疑问,为什么之前打印链表的时候不用断言指针,而在尾插时就要断言指针,以及为什么函数的形参是二级指针,而不使用一级指针。...因为,尾插分为两种情况(下面有写),当链表空时,头指针phead指向NULL,尾插相当于头插,此时要改变phead的指向,让phead指向这个新结点,此时就需要二级指针来改变一级指针的值(如果我们用一级指针做形参...至于这个什么时候要断言指针,什么时候不用断言指针:一级指针也就是phead,当链表空的时候,phead就是NULL,而二级指针永远指向phead,phead的地址是永远存在的,那么pphead就一定不可能为空

    36910
    领券