C++面试八股文:聊一聊指针?
某日二师兄参加XXX科技公司的C++工程师开发岗位第17面:
面试官:聊一聊指针?
二师兄:好的。
面试官:你觉得指针本质上是什么?
二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从
0x00000000
到0x3fffffff
,每一个字节都对应一个地址。当我们声明一个变量并初始化它时:
int a = 42;
二师兄:操作系统会分配一块容量为
4(sizeof(int))
的地址,这块内存的首地址是0x00001000
(假设),结束地址是0x00001003
,在申请的这4
个字节上放入42
。当我们对这个变量取地址时,
int a = 42;
int* p = &a;
二师兄:操作系统会再分配一块内存,这块内存的大小是
sizeof(int*)
,这块内存的起始地址是0x00002000
(假设),结束地址是0x00002003
(32位操作系统),然后将&a
取到的起始地址0x00001000
放入0x00002000
-0x00002003
中。并将刚分配的这块内存的起始地址赋给p
。
二师兄:当我们对
p
操作时,是对0x00002000-0x00002003
这块内存操作,当我们对*p
(解引用)操作时,是对0x00001000-0x00001003
这块内存操作。二师兄:回到问题,我觉得指针的本质就是内存地址。虽然指针指向一块内存地址,但它同时也是一个变量,也可以对指针取地址。如果对指针取地址,同样可以得到一个内存地址(如
0x00002000
),如果把这个内存地址存起来,那么指向这个内存地址的变量的类型就是二级指针(int**
)。面试官:好的。在
0x00002000-0x00002003
这块内存中,我们放入了一个地址是0x00001000
,但是并没有这个地址的长度。只知道一个地址而不知道长度,怎么能把数据取出来?二师兄:这主要是因为
p
的类型是int*
,当对p
解引用时,编译器知道了解引用的结果是int
类型,所以从0x00001000
往后读取4个字节(sizeof(int)
),并按照当前CPU的模式(考虑大小端)把这四个字节组成一个int
类型的变量。面试官:
malloc
函数你知道吧,返回的类型是void*
,在free
的时候怎么知道这块内存的大小的呢?二师兄:额。。这个还不太清楚。。
面试官:没关系,今天就到这里,回去等通知吧。
让我们来看看让二师兄折戟的这个问题:
malloc
函数返回的类型是void*
,在free
的时候怎么知道这块内存的大小的呢?
这里牵扯到malloc
和free
的实现方式,不同的厂商实现的方式不尽相同。以ptmalloc
为例,当使用malloc
申请size = 16
的内存时,malloc
会从内存池中分配一块sizeof(chunk)+16
长度的内存。chunk
段保存了一些前后chunk
的信息,也保存了这块内存的大小(16)。malloc
函数返回的地址是0x00001000
,而在free(0x00001000)
时,free
函数会用0x00001000
减去特定值(sizeof(chunk)
),得到chunk
的起始地址,从chunk
中获取这块内存真正的尺寸,从而完成free
的任务。抛开内存的利用率不说,这是一个非常美妙的实现!
好了,今日份面试到这里就结束了。关注我,每天带你学习一个C++小知识!
关注我,带你21天“精通”C++!(狗头)
C++面试八股文:聊一聊指针?的更多相关文章
- 《面试八股文》之 JVM 20卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...
- 《面试八股文》之kafka21卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是moon,最新一篇面试八股文系 ...
- 《面试八股文》之 Redis 16卷
微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...
- 面试官: 聊一聊Babel
点击关注本公众号获取文档最新更新,并可以领取配套于本指南的 <前端面试手册> 以及最标准的简历模板. 前言 Babel 是现代 JavaScript 语法转换器,几乎在任何现代前端项目中都 ...
- C语言面试题目之指针和数组
说明:所有题目均摘录于网络以及我所见过的面试题目,欢迎补充! 无特殊说明情况下,下面所有题s目都是linux下的32位C程序. 先来几个简单的热热身. 1.计算以下sizeof的值. char str ...
- 这可能是最全面的TCP面试八股文了
计算机网络基础,考验一个程序员的基本功,也能更快的筛选出更优秀的人才. 说说TCP的三次握手 假设发送端为客户端,接收端为服务端.开始时客户端和服务端的状态都是CLOSED. 第一次握手:客户端向服务 ...
- 一天吃透MySQL面试八股文
什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据.你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列).行代表每一行数据,列代表该行中的每个值.列上的值是 ...
- 一天吃透JVM面试八股文
什么是JVM? JVM,全称Java Virtual Machine(Java虚拟机),是通过在实际的计算机上仿真模拟各种计算机功能来实现的.由一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一 ...
- 这可能是最全面的MySQL面试八股文了
什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据.你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列).行代表每一行数据,列代表该行中的每个值.列上的值是 ...
- java数据结构面试问题—快慢指针问题
上次我们学习了环形链表的数据结构,那么接下来我们来一起看看下面的问题, 判断一个单向链表是否是环形链表? 看到这个问题,有人就提出了进行遍历链表,记住第一元素,当我们遍历后元素再次出现则是说明是环形链 ...
随机推荐
- Unity3D中的Attribute详解(五)
今天主要来讲一下Unity中带Menu的Attribute. 首先是AddComponentMenu.这是UnityEngine命名空间下的一个Attribute. 按照官方文档的说法,会在Compo ...
- Dijkstra(迪杰斯特拉)算法C++实现&讲解
Dijkstra迪杰斯特拉算法及C++实现 Dijkstra算法是典型的最短路径路由算法,用来计算一个节点到其他所有节点的最短路径.算法的基本思想和流程是:1. 初始化出发点到其它各点的距离dist[ ...
- 利用NGINX搭建部署直播流媒体服务器
直播如今是一个老生常谈的问题,怎么用于直播,大多数人只晓得,大佬某平台直播软件,点击开始即可直播.那么如何来搭建一个简易的直播平台呢?仅仅是有直播功能,没有涉及转码以及播放软件. 安装nginx以及r ...
- .NET中使用Redis总结 —— 1.Redis搭建
注:关于如何在windows,linux下配置redis,详见这篇文章:) 下载地址:http://redis.io/download Redis官方是不支持windows的,只是 Microsoft ...
- day8:列表相关函数&深浅拷贝&字典相关函数&集合相关操作/函数
字符串/列表/字典/集合 目录 字符串相关操作: 拼接 重复 跨行拼接 索引 切片字符串相关函数:常规11+is系列3+填充去除6+最重要3字符串拓展:字符串的格式化format 列表的相关操作:拼接 ...
- 文盘Rust -- 用Tokio实现简易任务池
作者:京东科技 贾世闻 Tokio 无疑是 Rust 世界中最优秀的异步Runtime实现.非阻塞的特性带来了优异的性能,但是在实际的开发中我们往往需要在某些情况下阻塞任务来实现某些功能. 我们看看下 ...
- 程序猿要chatpgpt干掉了?
如何拥抱被chatpgpt拉开的人工智能大时代 昨天 chatgpt-4 发布了.我看到好多技术圈的人都惶恐着,以后咱们都要失业了/(ㄒoㄒ)/~~ 和之前差不多的是毫无意外地又引动了一大波舆论.虽然 ...
- 【深度思考】聊聊CGLIB动态代理原理
1. 简介 CGLIB的全称是:Code Generation Library. CGLIB是一个强大的.高性能.高质量的代码生成类库,它可以在运行期扩展Java类与实现Java接口, 底层使用的是字 ...
- [Tensorflow]模型持久化的原理,将CKPT转为pb文件,使用pb模型预测
文章目录 [Tensorflow]模型持久化的原理,将CKPT转为pb文件,使用pb模型预测 一.模型持久化 1.持久化代码实现 convert_variables_to_constants固化模型结 ...
- Python Requets库学习总结
快速开始 发送请求 >>> import requests >>> r = requests.get('https://api.github.com/events' ...