- 博客(18)
- 收藏
- 关注
原创 Linux 基础 IO 学习笔记
fd 是连接用户态和内核态的桥梁。内核用 struct file 来描述打开的文件,里面有个 f_op 字段,是个函数指针,指向具体的操作函数。磁盘文件的 f_op->read 指向 disk_read,键盘的指向 keyboard_read,网络的指向 socket_read。接口统一,实现各异,这其实就是多态的思想,只不过是用 C 语言的函数指针实现的。当你 open 一个文件,内核会创建一个 struct file,然后在 fd 表里找一个最小的空位,把指针填进去,返回这个下标给你,这就是 fd。
2026-01-14 22:10:31
681
原创 程序地址空间(基于c++和linxu的一些个人笔记
虚拟地址空间是操作系统给进程制造的"幻觉",让每个进程以为自己独占一大片连续内存。内核用mm_struct描述虚拟地址空间,记录各区域的起止地址。用链表管理各个区域(代码段、数据段、堆、栈……)。页表负责把虚拟地址翻译成物理地址,同时做权限检查。进程隔离(互不干扰)简化编程(不用关心物理地址)灵活分配(虚拟连续,物理可以不连续)写时拷贝(fork 高效)权限保护(防止非法访问)按需加载(节省内存)
2025-12-05 19:10:54
893
原创 从零理解 Makefile 的完整笔记
这篇笔记整理的是我自己在 Linux 下写Makefile时遇到的所有知识点:包括gcc的编译/链接两阶段、clean.PHONY、模式规则、自动变量$@/$</$^wildcard自动收集源码、多文件工程的整体流程,以及相关的基础 Linux 命令。
2025-11-23 18:14:13
1062
2
原创 从内存泄漏到多态保障:为什么基类析构函数必须是虚函数?
基类析构类型派生类资源释放内存泄漏风险多态支持非虚函数不释放有不支持虚函数完全释放无支持只要类被设计为 “多态基类”(即可能通过基类指针指向派生类对象),就必须将析构函数声明为虚函数。这是 C++ 多态场景下资源安全释放的 “兜底保障”,也是面试和实际开发中不可忽视的细节。
2025-11-04 17:00:59
419
原创 从入门到实践:Linux 基础学习(xshell)
现在我们用的 Linux,严格来说 “Linux” 指的是内核,而平时用的完整系统是内核加上 GNU 工具链、GUI 组件等组成的,这一点刚开始学的时候很容易混淆,后来查了很多资料才搞明白。不过桌面领域它还有差距,虽然国内有中标麒麟、深度 Linux,国外有 Ubuntu,但在易用性、软硬件兼容性上,和 Windows 比还是差点意思,我家里的电脑装过 Ubuntu,偶尔会遇到打印机连不上、软件找不到的问题,日常办公还是得切回 Windows。,就是给所有者读读写执行权限,同组和其他用户读和执行权限。
2025-10-30 22:25:01
311
原创 栈与队列:从底层原理到实际应用
/ 用vector做底层的栈// 用list做底层的队列// 默认都是deque,等价于下面这样// 等价于stack<int, deque<int>>// 等价于queue<int, deque<int>>
2025-10-21 22:28:54
805
原创 深入浅出学排序:从概念到实战,一篇搞定常见排序算法
排序是指将一串记录,按照其中某个或某些关键字的大小,以递增或递减的顺序排列起来的操作。这里的 “记录” 可以是数字、商品信息、学生成绩等,“关键字” 则是排序的依据,如数字大小、商品价格、成绩高低等。排序算法是数据结构与算法的基础,掌握不同算法的核心逻辑、性能特性与适用场景,是高效解决实际问题的关键。日常开发中,快速排序因综合性能最优成为首选;需稳定排序时可选择归并排序;内存紧张时堆排序更合适;元素值范围小时计数排序效率极高。
2025-09-25 21:35:50
730
1
原创 堆:概念、算法与应用全解析
kn−1},按完全二叉树顺序存储在数组里,且满足 Ki≤K2∗i+1 且 Ki≤K2∗i+2(小堆,即小根堆,根结点最小),或者 Ki≥K2∗i+1 且 Ki≥K2∗i+2(大堆,即大根堆,根结点最大),这样的结构就是堆。堆具有两个重要性质:其一,堆中某个结点的值总是不大于或不小于其父结点的值;比如小根堆示例:[10,15,25,30,56,70],大根堆示例:[70,30,65,25,15,10]。同时,插入后执行向上调整算法时,要根据堆的类型(大根堆或小根堆)正确设置比较条件。
2025-09-21 16:36:00
1062
原创 C++ string 类深度解析与模拟(手把手讲解)
在遍历容器(如mapstring)时,迭代器类型往往冗长,automap<string, string> dict = {{"apple", "苹果"}, {"orange", "橙子"}};// 传统写法:map<string, string>::iterator it = dict.begin();// 自动推导为map迭代器类型while (it!++it;return 0;string封装性:将字符串的存储与操作封装为类,符合面向对象思想,简化代码。安全性。
2025-09-09 13:33:38
1346
原创 全网最详细之一的C 语言预处理讲解
C 语言编译器预定义了一组符号,无需声明即可直接使用,它们在预处理阶段被替换为具体值,常用于日志打印、版本追踪等场景。预定义符号功能说明__FILE__当前正在编译的源文件路径(字符串类型,如"main.c"__LINE__当前代码所在的行号(整数类型,如25__DATE__源文件被编译的日期(格式为,如__TIME__源文件被编译的时间(格式为"hh:mm:ss",如"15:30:45"__STDC__若编译器遵循 ANSI C 标准,值为1;非标准编译器可能未定义(如 VS 默认未定义)
2025-08-22 23:47:07
922
原创 函数指针变量
总的来说,函数指针是 C 语言中一个富有深度的知识点,它不仅拓展了函数调用的方式,也为后续更复杂的编程场景(如回调函数等)奠定了基础。掌握好函数指针,能让我们在 C 语言的世界里更灵活地操控程序逻辑,提升代码的效率与复用性。希望通过本次学习,大家能对函数指针有清晰的认知,并能在实际编程中灵活运用。
2025-08-21 08:00:00
834
原创 数组指针变量及二维数组传参本质
对比项数组指针(Pointer to Array)指针数组(Array of Pointers)本质指针(指向数组)数组(元素为指针)声明形式(指向 int [3] 数组)int* p[3];(存储 3 个 int * 指针)占用内存一个指针的大小(如 8 字节)整个数组的大小(如 3×8=24 字节)用途指向并操作整个数组存储多个指针,管理多个对象(*p)[n]是数组指针(先定义指针),*p[n]是指针数组(先定义数组)。
2025-08-19 08:00:00
1624
1
原创 移位操作符和位操作符
移位操作符是编程中用于对进行位移动的运算符,分为左移和右移两种基本类型。它们直接操作整数的二进制表示,通过移动位来改变数值。<< 左移操作符>> 右移操作符注:移位操作符的操作数只能是整数。
2025-08-13 09:00:00
1357
2
原创 结构体内存对齐
在我们已经掌握了结构体的基本使⽤之后,现在我们需要深⼊讨论⼀个问题:计算结构体的⼤⼩。这也是⼀个特别热⻔的考点: 结构体内存对⻬1:对齐规则⾸先得掌握结构体的对⻬规则:1. 结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处2. 其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处。对⻬数 = 编译器默认的⼀个对⻬数 与 该成员变量⼤⼩的较⼩值。VS中默认的值为8- Linux中 gcc 没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩。
2025-08-09 08:30:00
1501
1
原创 理解动态内存管理
但是上述的开辟空间的⽅式有两个特点: 1:空间开辟⼤⼩是固定的。 2:数组在申明的时候,必须指定数组的⻓度,数组空间⼀旦确定了⼤⼩不能调整 但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间⼤⼩在程序运⾏的时候才能知 道,那数组的编译时开辟空间的⽅式就不能满⾜了。 C语⾔引⼊了动态内存开辟,让程序员⾃⼰可以申请和释放空间,就⽐较灵活了。 C语⾔提供了⼀个动态内存开辟的函数: 这个函数向内存申请⼀块连续可⽤的空间,并返回指向这块空间的指针。 如果开辟成
2025-08-06 08:00:00
1031
原创 字符函数和字符串函数
c语言当中有一系列函数是专门用作字符分类的,也就是一个字符是属于什么类型的字符的。如果想要使用这些函数,一定要包含头文件ctype.h 这些函数的使用方式非常相似,在这里我们以其中一个函数为例子: islower 是能够判断参数部分的c是否是小写字母的。通过返回值来说明是否是小写字母,如果返回值为非零的整数,那么就是小写字母,反之则不是。这里我们再举一个实用的例子:编写一个程序把字符串里的小写字母全部变成大写,其余不变。 这时候这些函数的实用性才真正体现了出来。 c语言提供了两个字符转化函数
2025-08-04 09:00:00
488
1
原创 sizeof与strlen常见的笔试题辨析(接上期)
我们会发现,sizeof的应用场景十分广泛,那么各位读者大大可以试试能否独立思考出这些代码最后实现的结果到底是什么呢?那我也不卖关子了,程序运行结果图如下:屏幕前的你有没有做对呢 ,现在就让我来简单讲解一下为什么输出结果会是这样子吧。在这里我首先要提前说明两点:1:sizeof(数组名)——这里的数组名表示的是整个数组,所以最后得出的结果就是整个数组的大小,单位是字节。2:&数组名——这里取出的地址也是整个数组的地址。除此之外一般情况下数组名指的就是数组首元素的地址。sizeof(a)和sizeof(a+0
2025-08-02 08:15:00
1162
原创 深度辨析sizeof和strlen以及习题讲解
sizeofstrlen1. sizeof是操作符。1.strlen是库函数,使⽤需要包含头⽂件string.h2.不关注内存中存放什么数据2.srtlen是求字符串⻓度的,统计的是\0之前字符的隔个数3.sizeof计算操作数所占内存的⼤⼩, 单位是字节3.关注内存中是否有\0,如果没有\0,就会持续往后找,可能会越界。
2025-07-31 15:15:00
485
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅