- 博客(45)
- 收藏
- 关注
原创 Linux进程信号
访问零号地址,操作系统拿到的是虚拟地址,cr3寄存器可通过页表的地址找到页表,MMU将cr3的页表地址和要访问的0号地址做虚拟的页表转化,但是页表下在零号地址没有对应的映射关系,转化失败,硬件报错,cpu的寄存器无法把100写到0号地址处,发送11号信号,终止进程。上面的所有内容,我们都没有做非常多的解释,主要是先用起来,然后渗透部分概念和共识,下面我们从理论和实操两个层面,来进⾏对信号的详细学习、论证和理解。发送固定的6号(SIGABRT)信号给自己,要求进程必须处理,目的就是终止进程。
2025-04-04 21:13:08
890
10
原创 库制作与原理
库是写好的现有的,成熟的,可以复用的代码。细节:动静态库g++/gcc默认使用动态库,非静态链接只能-static,一旦-static,就必须得存在对应的静态库,只存在静态库,可执行程序对于该库,只能静态链接了。头文件包含了方法的声明,库包含了方法的实现,所以,对库的安装,其实就是将对应的头文件,库文件拷贝到系统的指定文件下,将来编译时只要指定库名称,gcc自动找头文件和库文件。在Linux系统下,默认安装大部分库,默认优先安装动态库,库:应用程序=1:n,vs不仅可以形成可执行程序,也能形成动静态库。
2025-03-07 20:50:13
1210
39
原创 Linux文件系统
机械磁盘是计算机中唯一的一个机械设备磁盘--- 外设,慢,容量大,价格便宜磁盘的存储结构扇区:是磁盘存储数据的基本单位,512字节,块设备如何定位一个扇区呢?柱面(cylinder),磁头(head),扇区(sector),显然可以定位数据了,这就是数据定位(寻址)方式之一,CHS寻址方式。
2025-02-22 18:05:11
1304
35
原创 文件基础IO
进程里面有一个stuct*file能找到文件描述符表, file是一个结构体,里面含有文件的各种属性,fd是指针数组,里面通过下标能访问到各自file,文件被打开时,创建file文件,再把file存入文件描述符表中最小的空的fd里面,fd通过地址文件能找到file能访问文件。进程在调用read等接口时操作系统拿着fd索引来到文件描述符表找到该fd内的file地址,每一个文件都要有自己的文件缓冲区,操作系统预加载,file找到缓冲区,将缓冲区的内容拷贝给read等接口自己的缓冲内,所以读写的本质就是拷贝!
2025-02-06 22:00:06
1024
41
原创 linux 进程补充
在bath进程启动的时候,在它自己内部构建出一张表,在用户输入指令时首先被bath拿到,被拆分成若干个字符串放在argv[0],argv[1],argv[3]...指针数组argv指向他们,bath通过argv【0】下的程序名字找到path下的二进制来运行。其实Linux里面的指令都是二进制文件,然后再链接我们总结写的文件,最后汇到一块一起运行,要运行一个二进制文件,必须先找到它 ./是在文件树下找,但是我把二进制拷贝到home下,系统默认的路径下我们不带./也能跑,这也是其他指令的由来。
2025-02-05 00:10:28
1843
24
原创 linux进程
在系统当中查找一个最合适调度的进程的时间复杂度是⼀个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!
2025-01-14 22:40:45
1308
42
原创 MSQL操作案例
createdatabase 数据库名:使用create命令创建一个数据库,database关键字后面接自定义数据库名字,默认UTF-8编码(utf8_ general_ ci)
2024-12-05 18:25:45
2570
68
原创 C++11
目录4. 可变参数模板4.1 基本语法及原理4.2包括展4.3 empalce系列接口5. 新的类功能5.1 默认的移动构造和移动赋值5.2.声明给缺省值5.3 defult和delete5.4 final 与 overator6.STL中一些变化7. lambda7.1 lambda表达式语法 7.2 捕捉列表7.3 lambda的应用7.4 lambda的原理8. 包装器8.1 function8.2 bindC++11支持可变参数模板,也就是说支持可变数量参数的函数模板和类模板,可变数目的参数被称
2024-11-10 22:35:44
714
77
原创 C++11
编译器在实现C++的时候为了形成逻辑的闭环,右值的右值引用可以被修改,属性退化。所以,我们在实现接口的时候实现完美转发避免这种问题,也可以完美转发。
2024-11-10 00:17:57
924
57
原创 Linux开发工具
vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。目前处于[插入模式],就只能一直输入文字,如果发现输错了字,想用光标键往回移动,将该字删除,可以先按一下「ESC」键转到[正常模式]再删除文字。控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode。在使用末行模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进入末行模式。
2024-10-19 19:48:58
894
44
原创 C++中set的使用
• set的声明如下,T就是set底层关键字的类型• set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数• set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第三个参数。• ⼀般情况下,我们都不需要传后两个模版参数。• set底层是⽤红⿊树实现,增删查效率是 O(logN) ,迭代器遍历是⾛的搜索树的中序,所以是有序的。
2024-09-26 17:03:18
1611
70
原创 二叉树进阶
⼩区⽆⼈值守⻋库,⼩区⻋库买了⻋位的业主⻋才能进⼩区,那么物业会把买了⻋位的业主的⻋牌号录⼊后台系统,⻋辆进⼊时扫描⻋牌在不在系统中,在则抬杆,不在则提⽰⾮本⼩区⻋辆,⽆法进⼊。:商场⽆⼈值守⻋库,⼊⼝进场时扫描⻋牌,记录⻋牌和⼊场时间,出⼝离场时,扫描⻋牌,查找⼊场时间,⽤当前时间-⼊场时间计算出停⻋时⻓,计算出停⻋费⽤,缴费后抬杆,⻋辆离场。:统计⼀篇⽂章中单词出现的次数,读取⼀个单词,查找单词是否存在,不存在这个说明第⼀次出现,(单词,1),单词存在,则++单词对应的次数。找N左⼦树的值最⼤结点。
2024-09-23 16:37:26
1336
84
原创 C++中的多态
多态是⼀个继承关系的下的类对象,去调⽤同⼀函数,产⽣了不同的⾏为。⽐如Student继承了Person。Person对象买票全价,Student对象优惠买票。2.1.1 实现多态还有两个必须重要条件:• 必须指针或者引⽤调⽤虚函数• 被调⽤的函数必须是虚函数。说明:要实现多态效果,第⼀必须是基类的指针或引⽤,因为只有基类的指针或引⽤才能既指向派⽣类对象;第⼆派⽣类必须对基类的虚函数重写/覆盖,重写或者覆盖了,派⽣类才能有不同的函数,多态的不同形态效果才能达到。2.1.2 虚函数。
2024-09-17 15:09:23
2951
90
原创 Linux基本指令
touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。:对于目录,该命令列出该目录下的所有子目录与文件。复制: ctrl + insert (有些的 insert 需要配合 fn 来按)Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。touch一个不存在的文件113,ll展开文件发现新建了一个113文件。:在当前目录下创建一个名为 “dirname”的目录。将当前工作目录改变到指定的目录下。: ls [选项][目录或文件]
2024-09-09 19:54:50
889
54
原创 【数据结构】二叉树
通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。这里我们从倒数的第一个非叶子结点的子树开始调整,一直调整到根结点的树,就可以调整成堆。删除堆是删除堆顶的数据,将堆顶的数据根最后一个数据一换,然后删除数组最后一个数据,再进行向下调整算法。:一个结点含有的子树的根结点称为该结点的子结点;
2024-08-24 18:33:03
1053
59
原创 【数据结构】栈和队列
队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。栈的实现一般可以使用数组或者链表实现,相对而言数组的结构实现更优一些。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有。:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。压栈:栈的插入操作叫做进栈/压栈/入栈,出队列:进行删除操作的一端称为。
2024-08-23 14:45:17
825
66
原创 【数据结构】链表
链表的结构跟火车车厢相似,淡季的时候车次的车厢会相应减少,旺季的时候车次的车厢会额外增加几节,只需将火车里的某节车厢去掉/加上,不影响其他车厢,每节都是相互独立的。链表中每个节点都是独⽴申请的(即需要插⼊数据时才去申请⼀块节点的空间),我们需要通过指针变量来保存下⼀个节点位置才能从当前节点找到下⼀个节点。当我们想要从第⼀个节点⾛到最后⼀个节点时,只需要在前⼀个节点拿上下⼀个节点的地址(下⼀个节点的钥匙)就可以了。链表是线性表的一种,物理结构不一定是线性的,逻辑结构一定是线性的。
2024-08-20 20:12:32
2263
58
原创 数据在内存中的存储
其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处。(低放高)⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。(高放低)上述概念需要记住,⽅便分辨⼤⼩端。
2024-08-20 00:23:40
1233
51
原创 C++中的继承
1.2.1定义格式class 派生类 : 继承方式 基类//子类内部自定义属性...下面我们看到Person是父类,也称作基类。Student是子类,也称作派生类。(因为翻译的原因,即叫父类/子类,也叫基类/派生类)1.2.2继承父类成员访问方式的变化继承关系和访问限定符1.2.3继承基类成员访问方式的变化继承规则类成员/继承方式public继承protected继承private继承父类的public成员子类的public成员子类的protected成员。
2024-08-08 17:50:56
2027
47
原创 C++的STL简介(四)
list_node来实现每个节点,list_iterator和list_const_iterator是两个不同版本的迭代器一个是普通迭代器一个是const类型的迭代器,名字上也有所区分,list本身就有迭代器的效果,这个是为了模拟这个,重载了一些基本运算符,而list是统一管理节点,具有增删查改等效果。List是连续的容器,而vector是非连续的容器,即list将元素存储在连续的存储器中,而vector存储在不连续的存储器中。在列表中遍历速度很慢,因为列表元素是按顺序访问的,而vector支持随机访问。
2024-08-02 18:32:50
1048
34
原创 C++的STL简介(二)
简单用typedef重定义char* 来模拟iterator获取begin()和end()提取字符重新构建string类。在指定位置插入字符或字符串。
2024-07-27 16:52:55
708
31
原创 C++的STL简介(一)
STL(standarf template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
2024-07-23 22:34:27
2188
32
原创 C++中的模板
T1 ,classT2 ,... ,classTnclass类模板名//类内成员定义一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链 接起来形成单一的可执行文件的过程称为分离编译模式。return 0;编译器报错解决方案1. 将声明和定义放到一个文件 "xxx.hpp" 里面或者xxx.h其实也是可以的,推荐使用这种//a.h。
2024-07-22 22:46:02
1647
17
原创 C/C++内存管理
如果申请的是内置类型的空间,new和malloc,delete和free基本相似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续的空间,而且new在申请空间失败时会抛异常,malloc会返回空。自定义类型在创建时会额外开一个整形放在开头记录对象个数,而编译器看到B没有写析构函数而优化了所以没有开,这个整形开辟是方便delete[]释放的,B释放的ptr2的指向的空间,释放完全,而A还有一个整型大小没有释放,所以内存泄漏报错。
2024-07-19 18:00:24
1170
19
原创 C++基础(三)
尽管使用初始化列表初始化,因为那些你不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值,初始化列表就会使用这个缺省值,如果你没有给缺省值,对于没有显示在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造会编译报错。之前的构造函数,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔开的数据成员列表,每个“成员变量”后面跟一个放在括号中的初始值或表达式。
2024-07-15 15:19:10
1373
20
原创 C++基础(二)
类的定义格式class为定义类的关键字,Stack为类的名字,{}中为类的主体,注意定义结束时后面分号不省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或成员函数。//text.cpp//成员变量int* a;int top;//成员函数void Pop()//分号不能省略int main()return 0;为了区分成员变量,一般习惯上成员变量会加一个特殊标识,如成员变量前面或后面加_或者m_开头。
2024-07-11 21:13:43
1474
19
原创 C++基础(一)
C++中域有函数局部域,全局域,类域;域影响的是编译时语法查找一个变量/函数/类型出处(声明或定义)的逻辑,所以有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的声明周期,命名空间域和类域不影响变量声明周期。定义命名空间,需要用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。引用不是新定义一个变量,而是给已存在变量去了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。调用域下面的变量/函数等。
2024-07-08 23:01:53
1697
17
原创 八大排序之计数排序
由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间的数字的最好的算法,但是它不适合按字母顺序排序人名。通俗地理解,例如有 10 个年龄不同的人,统计出有 8 个人的年龄比 A 小,那 A 的年龄就排在第 9 位,用这个方法可以得到其他每个人的位置,也就排好了序。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。1. 计数排序的特征。
2024-06-22 20:12:42
359
12
原创 八大排序之希尔排序
希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。
2024-06-16 20:17:38
347
12
原创 打印ArrayList打印出地址该怎么解决?
无论这三种哪种方式只要是传引用类型而不是传值都是在打印地址,此时我们只要重写toString就行了。编写程序,采用Arraylist存储3只猫的姓名,性别和花色信息,并输出。建立一个Arraylist类型 al 存入3个数据。方式三 iterator。方式一for -in。
2024-06-07 10:01:04
431
6
原创 c语言贪吃蛇
贪吃蛇(也叫做贪食蛇)游戏是一款休闲益智类游戏,有PC和手机等多平台版本。既简单又耐玩。该游戏通过控制蛇头方向吃蛋,从而使得蛇变得越来越长。贪吃蛇游戏最初为单机模式,后续又陆续推出团战模式、赏金模式、挑战模式等多种玩法。下面我们用c语言来实现贪吃蛇。首先我们在进行游戏的设置前初始化一些参数。
2024-05-04 14:34:10
514
9
原创 Win32 API设置控制台相关属性
小黑框也是有坐标的概念,为了我们后续游戏的进行,COORD是windows API中定义的一个结构体,表示一个字符在控制台屏幕缓冲区上的坐标,坐标系(0,0)的原点位于缓冲区的顶部左侧单元格。GetStdHandle是一个Windows API函数,他用于从一个特定的标准设备(标准输入,标准输出错误)中取得一个句柄(用来标识不同设备的数值),使用这个句柄可以操作设备。setlocale 函数用于修改当前地区,第LC_ALL 第二个参数为"C"正常模式和""本地化模式。//切换到本地化,支持宽字符等的输出。
2024-05-03 13:54:48
1191
5
原创 【数据结构】顺序表
顺序表,全名顺序存储结构,是线性表的一种。通过《什么是线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。不仅如此,顺序表对数据的物理存储结构也有要求。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。例如,使用顺序表存储集合,数据最终的存储状态如图 1 所示:图 1 顺序存储结构示意图。
2024-04-20 11:54:27
741
5
原创 C语言预处理详解
C语言设置了一些预定义符号,可以直接使用,预定义符号也是在预处理阶段完成的 基本语法: 效果: #define允许把参数替换到文本中,这种实现通常称为宏,或者宏定义下面是宏的申请方式:其中的parment -list是一个由逗号隔开的符号,它们可能出现在stuff中注意:参数列表的左括号必须与name相邻,如果出现空白字符,也会被解析成stuff的一部分举例: #define 实现的是整体替换,如下列代码:不能想当然的认为是把a+1计算成6然后再进行替换结果为36,宏定义的参数中只进行替换容易受到宏之外的
2024-04-05 01:06:18
2262
6
原创 C语言动态内存管理
c语言提供了一个动态内存开辟的函数,下面是cpiusplus中的介绍malloc是一个一个动态内存开辟的函数原型如下:这个函数向内存申请一块连续可用的以字节为单位的空间,并返回指向这块空间的地址。如果开辟成功,则返回一个指向开辟好空间的指针,如果开辟失败,返回NULL指针。开辟后记得判断是否开辟成功,否则不可使用返回值void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候由使用者自己决定如果参数size_t为0,malloc的行为标准是未定型,取决于编译器。
2024-04-04 16:57:06
620
8
原创 常用字符串函数
源头地址里的内容覆盖掉 目的地地址里的内容,并且返回目的地地址,目的地的大小要足够大才能覆盖完源头地址的字符。看看cplusplus对strcpy的解释。strerror能够打印错误码信息。两个地址内的字符串都得包含\0。
2024-03-14 20:23:15
484
6
原创 c语言实现结构体冒泡排序
【c语言实现冒泡排序 - 优快云 App】http://t.csdnimg.cn/5dXjF【c语言使用qsort实现冒泡排序 - 优快云 App】http://t.csdnimg.cn/qV3Rg。
2024-03-10 20:19:27
649
4
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人