C/C++中的NULL/nullptr到底是什么?

news/2024/12/15 12:19:18/文章来源:https://www.cnblogs.com/good-study-ya/p/18607828
  • 操作系统在运行程序时,总是根据内存地址来查找该地址中存放的内容,继而进行运算的。所以,要知道,加载到内存中的所有数据都是存放在一定的地址中的。
  1. 如下代码段,我们查看一下nullptr到底是什么?
点击查看代码
#include <iostream>int main()
{void* var = nullptr;std::cin.get();return 0;
}
- 解释一下上面一行普通的代码`void* var = nullptr;`,var是一个变量(只不过它是一个void*类型的指针变量),只要是变量,在内存中就会分配内存空间给这个变量,让它来存放数据。所以,这个变量var在内存中的地址是&var(0x005FFDBC),而这个变量的值是nullptr,也就是说在地址0x005FFDBC中存放了内容nullptr。 ![image](https://img2024.cnblogs.com/blog/790352/202412/790352-20241215113324582-551211131.png) - 打开visual studio的菜单项,"调试"->"窗口"->"内存",可以看到地址0x005FFDBC的前4个字节(windows x86的指针变量占据的内存就是4个字节,x64的是8个字节,这个可以通过sizeof(void*)来验证)的内容是00 00 00 00,也就是说nullptr实际上就是值0。 ![image](https://img2024.cnblogs.com/blog/790352/202412/790352-20241215114019745-882075879.png)
  • 当然,我们在写C++代码时,也可以使用NULL或0(容易产生阅读上的歧义),只不过在代码风格上可能会有些不统一,所以,一般而言,都是使用nullptr。NULL是一个宏定义,这个可以直接查看到,它也是0。
    image
  1. nullptr/NULL既然都是0,那为什么一个数字0会容易引起程序崩溃?
    这是因为当它代表或者转换( '#define NULL ((void*)0)' )为一个内存地址时,这个地址0x0000 0000在操作系统看来是一个无效的或者不存在的地址,所以,让OS从一个它认为无效的地址中取数据进行运算,就会出现访问冲突的问题,实际上并不是内存本身无效,而是OS认为它无效。

如下代码,写一个简单的类Entity,然后通过类的实例entity_instance来调用类的方法:

点击查看代码
class Entity
{
public:Entity() = default;~Entity() {}
public:void printType(){std::cout << "Entity" << std::endl;}const std::string& getName() const{return m_Name;}
private:Entity* m_Parent;std::string m_Name;
};
int main()
{Entity* entity_instance = nullptr;std::cout << entity_instance->getName() << std::endl;std::cin.get();return 0;
}

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/853194.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java NIO 核心知识介绍

Java NIO 核心知识介绍概要在传统的 Java I/O 模型(BIO)中,I/O 操作是以阻塞的方式进行的。也就是说,当一个线程执行一个 I/O 操作时,它会被阻塞直到操作完成。这种阻塞模型在处理多个并发连接时可能会导致性能瓶颈,因为需要为每个连接创建一个线程,而线程的创建和切换都…

#oscp#渗透测试 kioptix level 3靶机getshell及提权教程

声明! 文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关,切勿触碰法律底线,否则后果自负!!!!一、靶机搭建 点击扫描虚拟机选择靶机使在文件夹即可二、信息收集 前言 信息收集阶段,因为这里是靶机,所以不需要做什么,但是实际渗透测试中,大家…

rust学习十四.2、工作空间(workspace)

和大部分语言一样,cargo也可以创建一个工作空间,以便可以包含多个二进制单元和库单元,从而构建较为复杂的工程。 构建这样一个空间空间主要依赖两个手段:Cargo.toml和单元之间的目录结构 从效果上看,rust的Cargo在工作空间上的管理和maven大体相似,但是还不如maven那么的…

08一些元素的使用

一、今日学习内容 1、HTML常见的元素 HTML结构分析,H1到6,p元素,img,a元素,div,span元素 不常用元素,HTML全局属性 2、额外知识点补充 字符实体,URL地址,元素语义化,SEO优化,字符编码tip:这样在编写代码的时候就不用频繁的切换到英文状态下了 这样会提高编写代码的…

零基础科研小白の服务器看这个就够了

服务器 我们上网的时候经常会遇到连不上服务器,那啥是服务器呢。 其实就是一些特化的计算机,是远处有物理实体的设备。 from 挑战全网最硬核服务器基础知识 什么是服务器? 有 高计算 能力,能够通过网络 提供多种服务 的计算机。 服务器啥模样?服务器有什么特点? 计算能力…

2024-2025-1 20241415 《计算机基础与程序设计》第十二周学习总结

2024-2025-1 20241415《计算机基础与程序设计》第十二周学习总结 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十二周作业这个作业的目标 复习巩固前面所学的内容作业正文 https://www.cnblogs.com/zh…

Python序列的应用(九):集合以及列表、元组、字典和集合的区别

前言: 一、集合 Python 中的集合同数学中的集合概念类似,也是用于保存不重复元素的。它有可变集合(set)和不可变集合(fozenset)两种。本节所要介绍的可变集合是无序可变序列,而不可变集合在本书中不做介绍。在形式上,集合的所有元素都放在一对{}中,两个相邻元素间使用,分…

jQuery鼠标拖动旋转DOM元素插件

Propeller.js是一款jQuery鼠标拖动旋转DOM元素插件。通过该插件,可以使用鼠标拖动旋转页面中的任意DOM元素。使用方法 通过npm安装插件。npm install Propeller HTML结构 例如要拖动旋转一张图片。<img src="demo.jpg" id="img"> 初始化插件 作为jq…

js消息通知框、对话框、确认框和Loading插件

Notiflix是一款js消息通知框、对话框、确认框和Loading插件。Notiflix通过简单的设置,就可生成非常漂亮的s消息通知框、对话框、确认框和Loading效果。在线预览 下载使用方法 在页面中引入下面的文件。<link rel="stylesheet" href="css/notiflix-1.3.0.mi…

人工智能大语言模型起源篇,低秩微调(LoRA)

上一篇: 《规模法则(Scaling Law)与参数效率的提高》 序言:您在找工作时会不会经常听到LoRA微调,这项技术的来源就是这里了。 (12)Hu、Shen、Wallis、Allen-Zhu、Li、L Wang、S Wang 和 Chen 于2021年发表的《LoRA: Low-Rank Adaptation of Large Language Models》,htt…

群晖Lets Encrypt证书申请

注意本文时效性:2024.9.23 引言 为了保证SSL证书的权威性和安全性,Lets Encrypt 会验证您对域名的控制权。 申请 Lets Encrypt 证书有以下的验证控制权的方式:Web验证:通过在http的有权威的目录下创建一个验证文件以验证对服务器的控制权 Dns验证:通过在 DNS Record 中添加…

《计算机基础与程序设计》第十二周学习总结

学期(如2024-2025-1) 学号(如:20241300) 《计算机基础与程序设计》第十二周学习总结 作业信息这个作业属于哪个课程 <班级的链接> 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 <作业要求的链接> 2024-2025-1计算机基础与程序设计第十二周作业)这个作…