某日二师兄参加XXX科技公司的C++工程师开发岗位第17面:

面试官:聊一聊指针?

二师兄:好的。

面试官:你觉得指针本质上是什么?

二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从0x000000000x3fffffff,每一个字节都对应一个地址。当我们声明一个变量并初始化它时:

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的时候怎么知道这块内存的大小的呢?

这里牵扯到mallocfree的实现方式,不同的厂商实现的方式不尽相同。以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++面试八股文:聊一聊指针?的更多相关文章

  1. 《面试八股文》之 JVM 20卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. <面试八股 ...

  2. 《面试八股文》之kafka21卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是moon,最新一篇面试八股文系 ...

  3. 《面试八股文》之 Redis 16卷

    微信公众号:moon聊技术 关注选择" 星标 ", 重磅干货,第一 时间送达! [如果你觉得文章对你有帮助,欢迎关注,在看,点赞,转发] 大家好,我是 moon. redis 作为 ...

  4. 面试官: 聊一聊Babel

    点击关注本公众号获取文档最新更新,并可以领取配套于本指南的 <前端面试手册> 以及最标准的简历模板. 前言 Babel 是现代 JavaScript 语法转换器,几乎在任何现代前端项目中都 ...

  5. C语言面试题目之指针和数组

    说明:所有题目均摘录于网络以及我所见过的面试题目,欢迎补充! 无特殊说明情况下,下面所有题s目都是linux下的32位C程序. 先来几个简单的热热身. 1.计算以下sizeof的值. char str ...

  6. 这可能是最全面的TCP面试八股文了

    计算机网络基础,考验一个程序员的基本功,也能更快的筛选出更优秀的人才. 说说TCP的三次握手 假设发送端为客户端,接收端为服务端.开始时客户端和服务端的状态都是CLOSED. 第一次握手:客户端向服务 ...

  7. 一天吃透MySQL面试八股文

    什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据.你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列).行代表每一行数据,列代表该行中的每个值.列上的值是 ...

  8. 一天吃透JVM面试八股文

    什么是JVM? JVM,全称Java Virtual Machine(Java虚拟机),是通过在实际的计算机上仿真模拟各种计算机功能来实现的.由一套字节码指令集.一组寄存器.一个栈.一个垃圾回收堆和一 ...

  9. 这可能是最全面的MySQL面试八股文了

    什么是MySQL MySQL是一个关系型数据库,它采用表的形式来存储数据.你可以理解成是Excel表格,既然是表的形式存储数据,就有表结构(行和列).行代表每一行数据,列代表该行中的每个值.列上的值是 ...

  10. java数据结构面试问题—快慢指针问题

    上次我们学习了环形链表的数据结构,那么接下来我们来一起看看下面的问题, 判断一个单向链表是否是环形链表? 看到这个问题,有人就提出了进行遍历链表,记住第一元素,当我们遍历后元素再次出现则是说明是环形链 ...

随机推荐

  1. ES(ECMAScript)标准下中的let、var和const

    ES标准下中的let,var和const let会报重复声明,var则比较随意,重不重复无所谓 // 使用 var 的时候重复声明变量是没问题的,只不过就是后面会把前面覆盖掉 var num = 10 ...

  2. 痞子衡嵌入式:恩智浦经典LPC系列MCU内部Flash IAP驱动入门

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦经典LPC系列MCU内部Flash IAP驱动. LPC 系列 MCU 是恩智浦公司于 2003 年开始推出的非常具有代表性的产品 ...

  3. 搭建DHCP服务,实现自动分配地址

    DHCP实现原理 DHCP定义 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作.它是一种流行的Clien ...

  4. 基于SpringBoot实现单元测试的多种情境/方法(二)

    本文分享自天翼云开发者社区@<基于SpringBoot实现单元测试的多种情境/方法(二)>,  作者:才开始学技术的小白 1 Mock基础回顾 在上一篇分享中我们详细介绍了简单的.用moc ...

  5. day104:MoFang:个人中心页面&flask-admin&基于faker生成仿真数据

    目录 BUG:登陆跳转并解决页面卡顿现象 1.前端显示个人中心页面 2.flask-Admin构建和配置后台运营站点管理用户信息 3.基于Faker生成仿真测试数据 BUG:登陆跳转并解决页面卡顿现象 ...

  6. AVL树的构建

    package com.xd.leetcode.shu; /** * created by lianzhen on 2020-03-10 10:27. describe:平衡二叉树的构建 * * LL ...

  7. IDA 特征码生成和搜索脚本

    最近比较忙,就少写两句,直接附上源代码,其中的细节点就不再赘述,如有疑问,请留言. 一共就是实现了两个函数,一个用于搜索特征码 (SearchPattern),一个用于生成特征码 (GenerateF ...

  8. v-if与v-show造成部分元素丢失的问题——v-if复用元素问题

    pre { overflow-y: auto; max-height: 400px } img { max-width: 500px; max-height: 300px } 问题描述 在写tab切换 ...

  9. Vite-Admin后台管理系统|vite4+vue3+pinia前端后台框架实例

    基于vite4.x+vue3+pinia前端后台管理系统解决方案ViteAdmin. 前段时间分享了一篇vue3自研pc端UI组件库VEPlus.这次带来最新开发的基于vite4+vue3+pinia ...

  10. Android Studio 样式和主题背景

    样式和主题背景 转载自   Styles and Themes  |  Android Developers 借助 Android 中的样式和主题背景,您可以将应用设计的细节与界面的结构和行为分开,其 ...