指针赋值为NULL;是什么意思呢?

2023-05-16



int *p=NULL;这个NULL是什么意思?

    网上百度了下,有人说NULL=0;是在头文件中定义的;

    首先要说的是:非堆分配的内存是不需要free的。
    再说p=NULL;指针的变化是 p指向了一个地址为0的内存,这就提醒别人不要对这个指针进行解引用的操作。NULL其实就是0x0。p=NULL后,p指向0x0这个地址。此处的地址,你没有访问权限。

     空指针指没有定位内存的指针,值为null(0),你使用new或者malloc申请了指针p,使用后delete或者free,你必须将指针值设置为null,否则,p将成为一个非法指针,后续代码如果使用到该指针有可能会造成系统崩溃(内存不可以读不可写),或者,破坏自身有效内存数据(释放后,又在申请作为别的用途,恰巧系统分配了同一块内存)

     free(p)是只是将malloc申请的内存空间释放,在不改变free()函数的原型前提下是无法做到P=NULL的,P=NULL相当于空指针,不指向任何有效的对象。绝对不允许间接使用空指针,否则程序会得到毫无用处的结果或者全部是零的值,或者会突然停止。P=null,之后,p还是原来的类型的,不变的。


    比如说 我定义了一个整形变量 int a = 1;  同时定义了一个指针p指向这个变量a: int  *p = &a;
但我用完这个变量和指针的时候我把指针所指向的内存空间释放掉:free(p);这个时候p所指向的内存空间里面的数据1被清空的,但是指针p里面仍然存有一个地址(原来指向a变量内存空间的地址),此时通常再要把指针p设置成空指针:P = NULL。我的问题来了:从free(p);这条语句到p = NULL;这条语句,指针p的状态发生了哪些变化,到底什么样的指针才叫空指针?是不是P = NULL;之后,p里面所存放的地址就为空了?是这样理解吗?此时p还有指向的数据类型吗?比如说p还是一个int *型的指针吗?
 还有通常用if (p != NULL)来预防错误,就是说如果当指针p为空指针的时候,这个指针就最好不要用,要不然可能会发生内存泄露、空指针一场等错误,为什么呢?

1. int *p = &a; 这样的指针不可用 free , free 只是针对 malloc, realloc 的内存进行释放。
2. 空指针是指指针指向地址0,如果是你分配的内存,并且使用 free 释放,然后把指针置成 0 ,只是为了不进行非法的引用。

char* tmp = (char*)malloc(1024);
free(tmp);
tmp = 0;

在 free 后,如果后面再引用 tmp, 因为是个空指针,会导致进行崩溃。
如果不置为0,比如
char* tmp = (char*)malloc(1024);
free(tmp);
char* tmp2 = (char*)malloc(1024);
memset(tmp, 0, 1024);
这样,由于堆管理特性,很可能 memset(tmp, 0, 1024)写了 tmp2 指向的空间。
这样,释放完 tmp 后,再使用它,谓之野指针。
使用野指针会造成不可预期的后果,而使用空指针会造成比较确定的后果:崩溃。
所以 释放完后给指针赋成空,很大程度是避免以后错误地使用指针。


free(p)//报告系统,我要释放内存,系统就将该内存块标记为未使用,但不影响p的值
p = NULL//free被执行后,你需要将该指针标记为空,因为p指向的内存以被系统收回,不属于你的程序
这两个语句一般是在一起使用的

总结:为了避免野指针,定义指针的时候必须给指针初始化(以防指针空间的数据没有及时清空),用free(P)释放掉指针所指的内存空间后,必须立即同时把p赋值为NULL,避免后面程序指针P而导致意想不到的错误,甚至系统崩溃!


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

指针赋值为NULL;是什么意思呢? 的相关文章

随机推荐

  • Vim快捷键-键位图

    背景 嵌入式linux开发中 经常接触linux环境 最方便的莫过于使用vi 功能强大 适用范围广 因此了解一些vim中常见的命令对于日常工作学习大有裨益 针对于不同阶段 可以参考学习一下vim中的快捷键 提升工作效率 版本一 版本二 版本
  • P通道MOSFET简介

    A P Channel MOSFET is a type of MOSFET in which the channel of the MOSFET is composed of a majority of holes as current
  • Gcc编译优化等级介绍

    Gcc 编译优化简介 gcc 提供了为了满足用户不同程度的的优化需要 xff0c 提供了近百种优化选项 xff0c 用来对 编译时间 xff0c 目标文件长度 xff0c 执行效率 这个三维模型进行不同的取舍和平衡 优化的方法不一而足 xf
  • inline关键字的用法

    C代码可以在代码大小和执行时间两个方便优化 inline函数 gcc gnu org 这样描述 By declaring a function inline you can direct GCC to make calls to that
  • printf使用占位符控制输出格式

    printf 函数提供丰富的占位符参数以便精细地控制输出格式 xff0c 再进行字符操作的时候我们可能会使用到sprintf类函数进行处理 xff0c 因此这里对printf 函数的格式化输出控制进行较为 详细 讨论 简单的printf 语
  • 单片机main函数在中断函数里执行?

    引言 为什么复位中断服务程序里面直接调用的main函数 xff0c 难道所有程序都在复位中断里面执行的 xff1f 首先 xff0c Reset Handler 是单片机的一个中断 xff0c 其次 xff0c main 函数也确实被 Re
  • linux应用移植问题

    背景 公司设备降成本 xff0c 设备运行平台从armv7架构mpu换成了armv5架构的mpu xff0c 应用移植过程都挺顺利的 xff0c 只是牵涉到一个引用外部库的应用时 xff0c 运行该应用到引用库中的函数时 xff0c 应用抛
  • VSCode中格式化代码快捷键

    Shift 43 Alt 43 F
  • openwrt 时区设置无效问题

    最近在使用 openwrt 时发现在 web 控制台设置好时区后 xff0c 系统日志依然显示的是 UTC 时间 xff0c 慢了 8 小时 查了下原来是 openwrt 默认没有安装 zoneinfo xff0c 安装后即可 首先在 we
  • 修改weston桌面背景

    背景 linux开发板采用weston桌面系统 xff0c 希望修改默认桌面图片 xff1b 结果 在 etc xdg weston weston ini中新增 xff1a span class token punctuation span
  • 交叉编译构建GDB和GDBServer

    1 Problem statement I have a ARM GNU Linux board and I want to be able to debug programs running in it from the comfort
  • Linux获取库文件中的函数列表

    背景 函数库有些功能是可选的 xff0c 如果编译时没有开启特定选项 xff0c 编译生成函数库中就没有对应的接口函数 xff0c 一些依赖这些接口函数的应用执行时就会出现异常 xff0c 因此为了排查函数库是否包括特定函数 xff0c 我
  • 液晶屏接口介绍:8080接口详述,其他常用接口简介

    序言 本文的标题虽说是液晶屏的接口介绍 xff0c 但液晶屏的种类繁多 xff0c 种类大小尺寸不同 xff0c 液晶屏所用的接口也不同 恕本文实在无法把所有接口种类包含全面 比如说 xff0c 按尺寸大小来区分液晶屏的话 xff0c 有7
  • 移远EC20设置RNDIS模式拨号上网

    背景 4G模块原本使用QMI方式拨号上网 xff0c 客户反馈某种定制卡不能上网 xff0c 切换下拨号模式看下设备能不能正常上网 xff1b 过程 openwrt中如果使用RNDIS模式上网需要在kernel配置中使能以下项 xff1a
  • 波形分析--串口数据波形、DSRC 时间窗测量

    目录 串口数据波形TTL和RS232 485 DSRC 时间窗测量 串口数据波形 串口工具设置和发送的数据如下图所示 xff1a 串口数据波形如下 xff1a 起始位为1b的低电平 xff0c 如下图所示 xff1a 可以看到1b为8 68
  • C语言:结构体的空间分配和位定义

    目录 概述空间分配位定义 概述 本文收录结构体相关的知识点 xff0c 将遇到的相关问题和找到的解释说明集中在一起 xff0c 便于需要时快速查找 空间分配 请计算以下两个结构体所占用的空间大小 xff1a span class token
  • Android ndk开发C调用C++

    1 C 43 43 文件暴露给C的方法需要在前面加上 extern span class hljs string 34 C 34 span char getJsonStr span class hljs keyword span span
  • ROS智能车定位导航仿真(已实现)

    前提 xff1a 操作系统 xff1a ubuntu16 04 ROS版本 xff1a kinetic Gazebo版本 xff1a 7 0 0 参考 xff1a https blog csdn net lxzysx article det
  • STM32—cubeMX+HAL库的SPI接口使用

    摘要 xff1a 本文主要介绍STM32的SPI接口 cubeMX软件配置SPI接口和分析SPI相关代码 STM32之SPI简介 xff1a xff08 1 xff09 SPI协议 Serial Peripheral Interface 串
  • 指针赋值为NULL;是什么意思呢?

    xfeff xfeff int p 61 NULL 这个NULL是什么意思 xff1f 网上百度了下 xff0c 有人说NULL 61 0 xff1b 是在头文件中定义的 xff1b 首先要说的是 xff1a 非堆分配的内存是不需要free