首页
学习
活动
专区
工具
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.7K30

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

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

8510

数据结构-队列

队列是只允许在一端插入另一端删除的线性表,即一种先入先出(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);

53260

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

10710

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

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

9610

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节点,这个时候需要一个中间节点来表示这个准备删除的状态。

46720

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变量。...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站立刻删除

60320

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

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

78510

数据结构—线性表

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

66230

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

95800

《挑战30天C++入门极限》CC++中结构体(struct)知识点强化

cin>>ls->name>>ls->socre; head=NULL;//进入的时候先设置head指针指向任何地址,因为不知道是否一上来就输入null跳出程序...>>ls->name>>ls->socre; } le->next=NULL;//把链尾指针的next设置空,因为不管如何循环总是要结束的,设置空才能够在循环显链表的时候不至于死循环...test;//把ls指向动态开辟的堆内存地址 cin>>ls->name>>ls->socre; head=NULL;//进入的时候先设置head指针指向任何地址,因为不知道是否一上来就输入...cin>>ls->number>>ls->socre; head=NULL;//进入的时候先设置head指针指向任何地址,因为不知道是否一上来就输入null跳出程序...;//进入的时候先设置head指针指向任何地址,因为不知道是否一上来就输入null跳出程序 le=ls;//把链尾指针设置成刚刚动态开辟的堆内存地址,用于等下设置le->next,也就是下一个节点的位置

87620

Java实现单向链表

走while循环,也是头节点与新节点连接的(我已经head节点初始化过了,因此没必要判断头节点是否null)~ /** * 向链表添加数据 * * @param...; //Java会回收它,设置设置null应该没多大意义了(个人觉得,如果不对请指出哦~) deleteNode = null;...p1、p2,让p2比p1快k个节点,同时向后遍历,当p2空,则p1倒数第k个节点 /** * 找到链表中倒数第k个节点(设置两个指针p1、p2,让p2比p1快k个节点,同时向后遍历...= null),退出循环就会找到尾节点) 遍历链表 从首节点(有效节点)开始,只要不为null,就输出 给定位置插入节点到链表中 原本由上一个节点的指向交由插入的节点来指向 上一个节点指针域指向想要插入的节点...对链表进行排序 使用冒泡算法对其进行排序 找到链表中倒数第k个节点 设置两个指针p1、p2,让p2比p1快k个节点,同时向后遍历,当p2空,则p1倒数第k个节点 删除链表重复数据 操作跟冒泡排序差不多

2.5K103

windows下使用aspera_vlc windows

<< endl; } return -1; } // 转换描述符cd中的转换状态恢复成初始化状态,方法是iconv中的inbuff参数设置NULL iconv(cd, NULL, NULL, NULL...*outbuff = new char[64]; memset(outbuff, 0, sizeof outbuff); // "啊"的GBK编码0xB0A1,UTF-8编码0xE2 0x80 0x9C...inbuff[0] = 0xA1; inbuff[1] = 0xB0; char * inptr = inbuff; // 为什么设置这个中间指针inptr,而不支持采用 inbuff?...因为iconv会改变指针inbuff的值,这样在删除内存时delete[] inbuff,将会出错 size_t insize = 2; char * outptr = outbuff; // 作用与...本站仅提供信息存储空间服务,拥有所有权,承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站立刻删除

1.3K30

【数据结构初阶】单链表补充内容+又双叒叕刷链表题

为什么单链表的基本操作中无tail记录尾 4.替换法删除pos结点 4-1.变式 5 .链表调试 6.为什么学校老师讲的时候不先讲带头结点的 7.刷刷刷题 7-1.回文链表 7-2.相交链表 7-3...3.二级指针 以尾插函数例,如果主函数里的plist空,那么要改plist就要传二级指针 但是为什么在plist不为空的时候,要尾插一个 void SLTNodePushBack(SLTNode...; while (tail) { tail = tail->next; } tail->next = newnode;//3 } } 无头单向循环链表传二级指针发挥作用的情况...,敬请谅解  7-1.回文链表 OR36 链表的回文结构  思路1: 第一步:利用快慢指针找到链表的中间结点slow 第二步:中间结点开始以后的结点部分逆置(反转),得到相交链表的新头指针...第一步:定义大小Guard和Tail指针 第二步:   遍历尾插到相应新链表 第三步: 连接两个分割的链表 备注:记得bigTail->next置空!!!

29730

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

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

12610
领券