- 博客(34)
- 收藏
- 关注
原创 【 linux 】动静态库的制作
本文介绍了动静态库的基本概念、制作方法和对比分析。静态库(.a)在编译时被完整复制到可执行文件中,独立性好但占用资源;动态库(.so)在运行时加载,节省空间且便于更新。文章详细说明了动静态库的制作流程:静态库使用ar命令打包.o文件,动态库需加-fPIC和-shared选项。还对比了两者的特点,指出Linux默认使用动态库。最后解析了ELF文件格式,说明动静态库和可执行程序的组织结构差异,包括Segment和Section的关系。通过命令示例展示了如何查看ELF文件结构。
2026-05-29 18:20:22
225
原创 【 linux 】文件管理与重定向
本文介绍了进程对文件的管理机制,包括操作系统、进程和文件的交互关系,以及文件描述符的作用。详细讲解了文件打开方式(r/w/a)和系统调用函数(open/close/read/write)的使用方法,并分析了标准I/O库函数对系统调用的封装过程。同时解释了重定向的原理和文件缓冲区机制,说明缓冲区通过"以空间换时间"策略提高效率,并介绍了三种刷新条件。最后指出子进程会继承父进程的文件描述符表和缓冲区信息。
2026-05-27 17:57:38
424
原创 【 linux 】理解环境变量和虚拟地址空间
本文介绍了进程环境变量和虚拟内存管理的核心机制。环境变量是操作系统运行参数,可通过env、export等命令管理,子进程会继承父进程的环境变量表。虚拟地址空间通过页表映射物理内存,采用写时拷贝技术优化资源使用。当进程试图修改共享内存时,会触发缺页异常,系统分配新内存并复制数据。缺页异常分为软异常(如COW)和硬异常(需磁盘读取),是虚拟内存实现按需分页、内存交换等功能的基础。文章还解释了虚拟地址空间的意义及其对物理内存的保护机制。
2026-05-25 16:17:00
345
原创 【 linux 】进程的调度算法
本文介绍了Linux进程优先级和调度算法的核心机制。进程优先级分为实时进程(0-99)和普通进程(nice值0-19,超级用户可设-20至-1),通过nice/renice命令调整。Linux采用O(1)调度算法,使用active和expired两个优先级数组实现高效调度,通过位图快速定位待执行进程。当active数组为空时交换指针,但存在进程饥饿问题。2.6.23内核引入CFS调度器,采用红黑树按vruntime排序,确保公平调度,解决了O(1)算法的缺陷。
2026-05-23 13:20:12
387
原创 【 linux 】理解进程状态
文章系统介绍了Linux系统中的进程管理,重点分析了僵尸进程和孤儿进程的形成机制及处理方法。孤儿进程由init进程接管回收,而僵尸进程需要父进程通过wait/waitpid主动回收。详细讲解了进程状态(运行、阻塞、暂停)及其表示方式,阐述了进程控制块(PCB)的组织结构。在进程退出与等待部分,说明了退出码机制,对比了wait和waitpid系统调用的区别,并介绍了WEXITSTATUS和WIFEXITED宏的使用方法。通过代码示例展示了非阻塞轮询等待子进程的实现方式,为Linux进程管理提供了实用参考
2026-05-22 12:59:47
353
原创 【 linux 】认识make和makefile
本文介绍了GCC编译器的编译流程和条件编译机制。GCC编译过程分为预处理(宏替换、条件编译等)、编译(语法分析、代码优化)、汇编(生成机器码)和链接(绑定库文件)四个阶段。条件编译通过预处理指令实现代码选择性包含。同时讲解了Make工具的使用,它通过读取Makefile中的规则实现自动化编译,其中.PHONY用于声明伪目标(如clean),确保命令执行而非文件操作。这些工具共同构成了C/C++项目开发的基础编译体系。
2026-05-21 15:31:11
57
原创 关于linux操作系统
摘要:Linux作为现代计算世界的基石,从1991年林纳斯·托瓦尔兹的个人项目发展为全球最重要的开源操作系统。文章分析了开源与闭源的本质区别,揭示了开源在商业竞争中的战略价值。Linux在不同领域呈现两极分化:占据服务器、云计算和超级计算机90%以上份额,主导移动端和物联网市场,但在桌面PC领域仅占3-4%。这种格局源于技术特性、生态壁垒和商业策略等多重因素,展现了开源软件独特的生命力与局限性。(149字)
2026-05-21 13:47:19
368
原创 【 C++ 】聊聊关于set和map
摘要:STL中的map和set都是基于红黑树实现的有序关联容器。set存储唯一且有序的元素,元素不可修改,主要提供高效的查找功能。map存储键值对,键唯一且有序,支持通过键快速查找值,使用[]操作符时若键不存在会自动插入。两者都具有O(logn)的查找、插入和删除效率,支持自动排序但不支持随机访问。map提供下标访问方式,而set则提供计数功能。此外,STL还提供允许重复键/值的multimap和multiset变体。
2026-02-23 16:08:02
352
1
原创 【 C++ 】搜索二叉树
删除逻辑略有些麻烦,需要分类讨论,第一种情况是左右节点都没有,直接delete即可,二三情况就是没有左节点或没有右节点,第一种情况可以并入二三情况。第四种情况就是左右节点都有,直接删除肯定是不行的,所以我们采用替代法,找一个不破坏搜索二叉树定义的值和目标值替换。有两种替换方法,一种是找左子树的最大值,一种是找右子树的最小值。这里简单列一下核心代码。如果有一模一样的值默认是不加入的,当然你可以自己调整代码逻辑,我这里是默认不加入。注意是所有值,也就是左子树的最大值也小于根,同理,右子树的最小值也大于根。
2026-02-18 22:40:10
232
原创 【 C++ 】一篇搞懂stack_queue + 模版进阶
本文摘要:文章首先介绍了C++新容器Deque的特性及其在实现栈和队列中的应用。接着深入探讨模板进阶知识,包括非类型参数模板、按需实例化原理以及模板的分离编译机制。重点解析了模板特化的两种形式:全特化(指定所有参数)和偏特化(部分参数限定),并通过多个代码示例展示指针、const引用等场景下的特化应用。最后总结了模板特化的匹配优先级规则,强调编译器按需实例化的特性。全文通过理论与实践结合的方式,系统讲解了C++模板编程的核心概念和技术要点。
2026-02-03 23:37:58
557
原创 【 C++ 】一篇搞懂list
本文介绍了C++中list容器的基本概念和模拟实现方法。list是STL中的双向链表容器,通过指针连接分散节点,每个节点包含数据、前驱和后继指针。与vector相比,list不支持随机访问,但插入/删除效率更高。文章详细讲解了list节点的基本结构(struct实现)、迭代器的封装(包含解引用、递增等操作符重载)以及模板实例化技巧。
2026-01-28 19:48:46
510
原创 【 C++ 】一篇搞懂 vector
本文介绍了C++标准库中的vector容器及其实现原理。vector是一种动态数组,能自动扩容缩容,支持随机访问。文章详细讲解了vector的内存分配机制,包括size()和capacity()的区别,以及扩容时内存重新分配的过程。同时阐述了模板实例化的特点,即按需生成代码的特性。最后给出了vector的模拟实现代码,展示了如何通过三个指针(_start、_finish、_end_of_storage)来管理内存,并解决了浅拷贝和迭代器失效等问题。
2026-01-27 21:20:36
659
原创 【 C++ 】 初识模板
摘要:本文介绍了C++中的泛型编程和模板技术。主要内容包括:1.泛型编程的概念及优势,通过模板实现代码复用;2.函数模板的语法格式、原理及实例化方式(隐式/显式),以及模板参数匹配原则;3.类模板的定义格式和实例化方法。文章通过交换函数和栈类的示例,展示了模板如何解决代码复用问题,并比较了模板函数与普通函数的区别。模板技术是泛型编程的基础,能提高代码的可维护性和复用性。
2025-11-28 22:58:41
537
原创 【 C++ 】内存管理
本文介绍了C++程序内存区域的划分和内存管理方式。C++提供了new/delete操作符进行动态内存管理,相比C语言的malloc/free,new/delete不仅能为内置类型分配内存,还会为自定义类型调用构造函数和析构函数。文章还深入解析了operator new/delete的底层实现原理,指出它们最终通过malloc/free实现,但增加了异常处理机制。最后对比了malloc/free与new/delete的区别
2025-11-28 13:55:00
790
原创 【 C++ 】类与对象 — 初始化列表,static,友元,内部类
本文摘要:本文系统介绍了C++中四种重要的类特性:初始化列表、static成员、友元和内部类。初始化列表部分详细讲解了其语法规则和使用场景,特别是对引用、const成员等特殊变量的初始化要求。static成员部分阐述了静态变量和函数的特性,包括初始化方式和访问规则。友元部分说明了友元函数和友元类的声明方式及其突破封装的能力。内部类部分则介绍了其作为独立类的特性以及与外部类的关系。全文通过代码示例直观展示了各特性的实际应用,为C++面向对象编程提供了实用参考。
2025-11-27 16:50:39
653
原创 【 C++ 】类与对象的项目实践 — 日期类的实现
本文介绍了一个日期类的实现项目,通过定义Date类实现日期相关功能。项目包含日期加减天数、比较大小、计算日期差等实用功能。关键实现包括:1)使用数组存储每月天数并处理闰年判断;2)重载运算符实现+=、+、++等日期运算;3)通过比较运算符重载实现日期比较;4)重载<<和>>运算符实现日期输入输出;5)采用朴素算法计算日期差。项目展示了如何通过类封装和运算符重载来实现复杂的日期操作,代码结构清晰,功能完整实用。
2025-11-27 15:10:28
716
原创 【 C ++ 】类的默认成员函数
本文介绍了C++中默认成员函数的概念及其重要性。编译器会在类未显式定义时自动生成这些函数,但其默认版本存在局限性:除移动相关函数外,其他默认函数均为浅拷贝,可能导致资源管理问题。文章通过MyString类的示例展示了浅拷贝带来的双重释放问题,并详细解析了各默认成员函数的特点、使用场景和注意事项。
2025-11-25 14:38:15
770
原创 【 C++ 】初识C++
本文介绍了C++基础的三个核心概念:1) 命名空间(namespace)用于解决命名冲突,可以通过域操作符(::)访问嵌套空间;2) 缺省参数分为全缺省和半缺省,需从右往左连续指定;3) 引用是变量的别名,必须初始化且不可更改引用对象,与指针相比更安全。文中通过代码示例展示了const引用、函数重载等特性,并比较了引用与指针的区别。这些特性体现了C++在保持C语言高效性的同时,增加了面向对象编程能力的特点。
2025-11-16 22:17:02
566
原创 【 C++ 】类的基本结构&this指针的用法
本文介绍了C++类的基本结构和特性。类使用class或struct关键字定义,其中class默认成员为private,struct默认public。类实例化时才会为成员变量分配内存,对象存储位置决定成员变量的存储区域。this指针存在于非静态成员函数中,指向当前对象首地址。构造函数在对象创建时初始化成员变量,如示例类A所示,对象a的成员变量_hour、_minute、_second在实例化时分配内存。本文还对比了struct与class的异同,说明它们是C++中表达类的两种等价方式。
2025-11-16 20:38:51
324
原创 二叉树的基本定义和堆排序算法
本文介绍了二叉树的基本性质与堆的相关算法。首先阐述了完全二叉树和满二叉树的特征,包括节点数计算公式和叶结点与分支节点关系。其次说明了二叉树的两种存储结构(顺序和链式)以及堆的定义(大/小堆)。重点讲解了堆的构建算法:向上调整和向下调整,通过比较父子节点值来维护堆特性。最后详细解析了堆排序的数学原理和实现过程,通过交替使用两种调整算法,将极值元素交换到数组末端完成排序。堆排序可根据需求构建大/小堆实现升序或降序排列。
2025-10-26 22:16:03
318
原创 栈和队列的互相转化与循环队列的实现
本文介绍了两种数据结构实现方法。1.队列实现栈:通过两个队列互相配合,利用队列的基本操作模拟栈的后进先出特性。关键点在于通过假设法确定空队列与非空队列,将前size-1个元素转移到空队列后删除最后一个元素实现出栈。2.循环队列实现:使用数组存储数据,通过head和tail指针的取模运算实现循环特性。文中详细说明了插入数据时tail指针的移动逻辑,以及如何通过额外空间简化空/满队列判断。两种实现都体现了数据结构的灵活转换和基础运算的应用。
2025-10-16 16:43:14
538
原创 单链表的基本应用
摘要:单链表的物理结构在内存中不连续,但逻辑上是连续的。通过指针连接各节点,动态内存管理分配空间。文章介绍了单链表的基本操作:使用malloc动态创建节点,头结点的初始化与应用,以及指针的命名与使用技巧。重点讲解了节点复制、链表分割等典型问题的解决思路,强调内存释放的重要性。通过代码示例帮助理解单链表的实际应用,为初学者提供了实用的学习指导。
2025-10-04 19:28:56
246
原创 编译和链接
文章摘要:ANSIC程序的实现涉及翻译环境和执行环境。翻译环境包括编译(预处理、编译、汇编)和链接过程,将源代码转换为可执行文件。预处理处理宏定义、头文件等;编译进行词法、语法分析并生成汇编代码;汇编转换为机器指令的目标文件。链接处理多文件间的调用。执行时程序载入内存,通过堆栈管理局部变量,静态内存存储全局变量,最终通过main函数执行和终止程序。
2025-06-04 23:15:22
250
原创 C语言中的文件操作
本文介绍了C语言中文件操作的基本概念与方法。文件分为程序文件和数据文件,数据文件又包含文本文件和二进制文件。通过FILE*指针操作文件流,文章详细说明了文件打开模式(如"r"和"w")和常见读写函数(fgetc、fputs等),并演示了字符、文本行、格式化数据及二进制数据的读写示例。同时介绍了文件随机读写函数(fseek、ftell)和文件结束判断方法,最后解释了缓冲文件系统的工作原理,强调操作文件时刷新缓冲区或关闭文件的重要性。
2025-06-04 22:55:39
368
原创 自定义类型:结构体
C语言通过结构体(struct)支持自定义数据类型,用于描述复杂对象。结构体可以包含不同类型成员变量,支持变量声明、初始化和嵌套定义。成员访问通过点操作符(.)或指针(->)实现。结构体内存对齐遵循特定规则:首成员偏移0地址,其他成员按对齐数(成员大小与编译器默认值较小者)整数倍排列,总大小为最大对齐数的整数倍。位段(bit-field)可节省空间,通过冒号指定成员占用的bit位数,但存在跨平台兼容性问题,且位段成员无法直接取地址。结构体和位段为C语言提供了灵活的数据组织方式。
2025-05-29 17:29:01
1123
原创 整数和浮点数在内存中的存储
本文介绍了整数和浮点数在内存中的存储方式。整数采用二进制补码形式存储,负数需要经过原码、反码到补码的转换过程。数据存储有大小端之分,大多数编译器采用小端模式。浮点数依据IEEE754标准存储,表示为(-1)^SM2^E形式,其中S为符号位,M为有效数字,E为指数。32位和64位浮点数分别用不同位数存储各部分,并采用特殊规则处理M和E的存储。文章还说明了从内存读取浮点数时的三种不同情况处理方式。
2025-05-28 14:33:42
249
原创 字符函数和字符串函数,c语言内存函数
C语言提供了丰富的字符和字符串处理函数,包括字符分类函数(ctype.h)、字符转换函数(tolower/toupper)以及字符串操作函数(strlen、strcpy、strcat、strcmp等)。这些函数要求目标空间足够大且可修改,源字符串以'\0'结尾。此外,内存操作函数如memcpy、memmove、memset等可处理字节级数据,其中memmove能处理内存重叠情况。这些函数可用于解决实际问题,如判断字符串旋转关系(通过strcat和strstr实现)。理解这些函数的特性和实现原理有助于灵活运用
2025-05-26 20:42:47
413
原创 指针的学习与思考
本文介绍了指针的基础概念与应用,包括指针的定义、const修饰符、野指针防范、指针运算、指针与数组的结合、指针数组与数组指针的区别,以及函数指针和传址调用。还涉及了typedef重命名、qsort函数的使用和void*指针的通用性,最后简要提及二级指针的概念。全文重点解析了指针在不同场景下的操作规则和注意事项,为理解指针提供了系统性的知识框架。
2025-05-22 15:29:48
1527
原创 扫雷游戏代码完成与反思
首先我分为三个文件来完成这段代码,一个用来进行函数的声明,命名为game.h,一个用来进行函数的定义,命名为game.c,剩下一个便是主函数,命名为test.c。这里还需要写一个函数统计坐标周围有几个雷,因为是雷的坐标规定为字符1,非雷坐标规定为字符0,因为要统计该坐标周围雷的数量,所以我们可以将该坐标周围一圈都相加起来和‘0’做比较,差值便是雷的数量。4.排查雷,如果被炸死了,打印mine,输出时显示布雷的位置,如果坐标不是雷,显示周围的雷,把*换成字符,打印show。这就是我的扫雷游戏的代码的完成。
2025-05-10 17:51:33
1235
原创 分支 循环语句
C语言程序设计的三大结构包括顺序、选择和循环结构。选择结构通过if/else和switch实现。循环结构有while、for和do-while三种:while/for先判断后执行,do-while至少执行一次。循环控制使用break(终止)和continue(跳过本次)。逻辑运算符包括&&(与)、||(或)和!(非),关系运算符需注意==和=的区别。三目运算符? : 实现条件判断。
2025-05-08 14:30:18
237
原创 第一篇博客,谈谈计算机学习
目前我在学习c语言,我的计划是每天花3小时及以上来学习并按时完成老师布置的作业,当天晚上要复习,下次学习开始前要回顾,保证效率和进度兼顾,这是开始,也是我对学好计算机的一个态度。也可以类比成打的第一场仗,所以只许成功。日反思,周回顾,月梳理,自律自律再自律,认真认真再认真。目前我是一名计算机专业的大一学生,计算机专业的知识相对于其他专业要复杂很多。计算机语言,数据结构与算法,数据库,操作系统等等。过程注定漫长,但坚持每天完成计划的自足与对学有所成后的期待也足以让人度过这漫漫旅程。
2025-04-29 13:17:55
192
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅