- 博客(27)
- 收藏
- 关注

原创 【详解】函数栈帧——多图(c语言)
前言在c语言中我们会将一些功能单独写成一个函数,以供主函数调用,在表面来看调用的过程就是写出一个函数后,只需要在调用时中通过函数名将实参传给形参就实现了整个过程,但实际上调用的过程远比你想的复杂,这其中函数栈帧起着关键作用。通过本篇文章,我将告诉你函数在调用时计算机内究竟发生了什么?一.函数栈帧是什么?C语言中,每个栈帧对应着一个未运行完的函数。栈帧中保存了该函数的返回地址和局部变量。(来自百度百科)。通过这句话我们可以提炼出两个关键信息:1.每个未运行完的函数都有一个对应的栈帧2
2021-10-15 21:58:38
8202
46

原创 【详解】KMP算法——多图,多例子(c语言)
前言KMP算法作为程序员的必修课之一,其抽象的过程让初学者叫苦不迭,但是当你完全理解过后会发现其中蕴含着创造者的无穷智慧。本篇文章我将以大量的例子与图片,为你讲解这个奇妙的算法。KMP算法是什么?KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函
2021-09-19 15:25:44
18464
48
原创 【CPP】死锁产生、排查、避免
死锁是指两个或多个线程互相等待对方释放资源,导致程序无法继续执行的现象。在多线程编程中,死锁是一种常见且严重的并发问题。
2025-04-18 21:08:45
843
原创 【形象解析】ptmalloc、tcmalloc与jemalloc对比
对于ptmalloc,tcmalloc,jemalloc网上有很多解析,讲的很好也很仔细,但是想要彻底看懂还是很有难度的,我这篇文章主要以自己的理解并结合形象的举例对比三者的区别,相对于大部分文章我不会深入的探讨三者的具体结构,而是从接触新手的角度,通过对比三者的区别,以举例子让大家对这三个常见内存池有一个整体且直观的概念,其中有很多地方舍弃了结构设计的细节,只保留核心的申请释放过程,讲解相对来讲没有那么严谨,如有错误请在评论区指正。
2025-04-17 22:14:48
935
原创 【CPP】内存泄漏详解
内存泄漏通常会逐渐积累,导致程序占用过多的内存资源,最终可能引发程序崩溃、系统卡顿,甚至在长时间运行的系统中发生内存溢出。RAII(Resource Acquisition Is Initialization)是 C++ 中的一种资源管理模式,意味着资源(如内存、文件句柄、网络连接等)在对象的构造函数中分配,并且在析构函数中释放。如果在容器中存储指针类型数据而没有正确释放对象的内存,会导致内存泄漏。在 C++ 中,如果你为一个对象或数组动态分配了内存,但没有在适当的位置释放这些内存,就会导致内存泄漏。
2025-04-07 20:16:53
1078
原创 【Linux】高级IO
它是 Unix-like 操作系统中非常重要的一个函数,提供了一些功能,如设置文件描述符的属性、修改文件状态、获取文件信息等。是计算机系统中两种常见的 I/O 模型,它们描述了应用程序如何与操作系统进行交互来执行 I/O 操作(如读取文件、网络通信等)。它允许一个程序监视多个文件描述符(如套接字、文件等),并在其中某些文件描述符准备好进行读写操作时,通知应用程序进行相应的处理。不同的I/O模型有不同的特点,适用于不同的应用场景。如果指定了超时时间,它将阻塞,直到一个文件描述符上的事件发生,或者超时。
2025-03-06 21:32:12
875
原创 【Linux】网络套接字
是在后台运行的进程,它通常不与任何终端交互,并且在系统启动时或系统运行过程中自动启动。守护进程化(Daemonization)指的是将一个普通的进程转变为守护进程的过程。需要注意的是,这个返回值是一个静态缓冲区的指针,因此在多线程环境中使用时需要小心。的区分主要是通过进程的输入/输出交互方式来确定的,具体来说是基于终端控制和进程的执行方式。后台进程是指在系统后台运行的进程,它不会占用当前终端的输入输出流。是一个系统调用函数,用于创建一个新的套接字,用于在应用程序和操作系统的网络协议栈之间进行数据传输。
2025-03-06 21:27:52
787
原创 【Linux】线程控制
生产者-消费者模型是多线程编程中的经典同步问题,它的目标是协调多个线程的操作,确保生产者和消费者之间的交互不会发生冲突。生产者:生产者线程负责产生数据,并将数据放入共享缓冲区或队列中。消费者:消费者线程负责从共享缓冲区或队列中取出数据并消费。缓冲区的大小是有限的,因此生产者和消费者之间需要协调:如果缓冲区已满,生产者需要等待;如果缓冲区为空,消费者需要等待。
2025-03-06 21:26:24
1110
原创 【Linux】进程信号
信号是 Linux 操作系统提供的一种轻量级、异步的进程间通信机制,用于通知进程某些事件的发生统一机制:进程自动继承信号机制:操作系统通过系统调用(如 、)和库函数(如 、),暴露信号管理的接口。进程可以通过这些接口查询、屏蔽、修改或触发信号。异步性:信号可以在任意时刻产生,与进程当前执行的代码无关。统一性:所有进程共享统一的信号处理机制,无需单独实现。轻量性:相比消息队列、管道等通信方式,信号更加高效。 是每个进程的核心数据结构,包含了描述进程状态的所有信息。
2025-03-06 21:25:35
990
原创 【Linux】进程通信
共享内存的主要特点是高效、直接、低开销的进程间数据共享,但同时它也带来了进程间同步和安全性的问题,要求合理的同步机制来避免数据冲突和不一致。尽管管道的核心是内存缓冲区,但操作系统通过对管道的实现,让它看起来像文件一样可以用文件操作接口(如。生成对应对的唯一标识符,然后交给操作系统,操作系统统一维护共享内存段,返回给我他维护下的。当读取管道时,如果管道缓冲区中没有数据,读取的进程会阻塞,直到有数据写入为止。,来确保访问共享内存的进程之间的协调,避免同时修改同一数据而导致的不一致。,用于在进程之间传递数据。
2025-03-06 21:24:18
938
原创 【Linux】文件
在获取到相应的文件数据块后,操作系统会将文件的内容加载到物理内存中的一个页框(page frame)。的指针,而它当中又存有调用该文件读写时对应的读写函数指针,此时只要将该函数指针指向驱动提供的读方法和写方法,操作系统不需要知道具体是如何读写的,但由于接口的统一,它只需要调用就能完成外设的控制。当文件被映射到虚拟内存后,文件的内容并不是立即加载到内存中的,而是在进程访问文件内容时,操作系统根据需要将文件的相关部分加载到内存。文件的物理数据存储在磁盘的块中,这些块由文件系统(如 ext4 等)管理。
2025-03-06 21:23:00
629
原创 【Linux】进程控制
在 Linux 系统中,创建进程通常通过fork()系统调用实现。fork()会创建一个新的进程,称为子进程,它与父进程共享几乎所有的资源(如文件描述符、环境变量等),但具有独立的地址空间。子进程最初的内容是父进程的精确副本。
2025-03-06 21:11:49
955
原创 【学习笔记】二叉树(c语言)
1.树1.1树的性质树是一种非线性的数据结构,他是由n(n >= 0)个有限结点组成一个具有层次关系的集合。把他叫做树是因为他看起来向一颗倒挂的树,也就是说他是根在上,叶在下的。1.2树的相关概念节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I...等节点为叶节点非终端节点或分支节点:度不为0的节点; 如上图:D、E、F、G...等节点为分支节点双亲节点或父节点:若一个节点含有子节点,则这
2022-01-11 15:18:56
852
9
原创 【学习笔记】堆(c语言)
1.堆的概念堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。我们抛去表面看本质:堆就是一种特殊的数组,但在想象中是二叉树的结构,且该二叉树的mei。2.堆的分类2.1大根堆堆中某个结点的值总是不大于其父结点的值图:2.2小根堆堆中某个结点的值总是不小于其父结点的值图:3.堆的性质 堆中某个结点的值总是不大于或不小于其父结点的值; 堆总是一棵完全二叉树。 4.将数组建成堆前面说过堆就是一种特
2022-01-10 17:35:25
2777
原创 【学习笔记】双向带头循环链表(c语言)
1.链表分类链表的结构多种多样有三个大分类:1.单向、双向2.带头、不带头3.循环、不循环而三组之间又可以互相组合,使得链表的结构多达8种,本篇的单链表主要是指单向不带头不循环链表,这也是本篇的重点。1.1单向链表单向链表:指链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始,只能通过前一个结点找到后一结点,而不能从后一结点找到前一结点。1.2双向链表双向链表:指链表的每个数据中结点都有两个指针,分别指向直接后继和直接前驱,它能从双向链表中的任意一个结点开始,并
2021-10-29 19:46:32
872
10
原创 【详解】指针与函数传参——多图、多例子(c语言)
前言在用c语言实现链表时,会有很多朋友无法理解明明传了指针到函数中,函数中对指针改变却无法影响原函数中指针的位置,事实上,这是因为你对形参和实参的关系理解还不够透彻。通过这篇文章,我将告诉你指针传参时,函数的形参到底该选择怎样的类型接收。1.函数的实参与形参实际参数(实参)真实传给函数的参数叫实参。实参可以是常量、变量、指针甚至函数等。无论实参是何种类型的量,在进行函数调用时,他们都必须有确定的值,一边把这些值传给形参。形式参数(形参)形式参数时至函数名后括号中的变量,
2021-10-28 12:15:16
5733
13
原创 【学习笔记】栈(c语言)
1.栈的概念栈:一种特殊的线性表,其只允许再固定的一段进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端成为栈底。栈中的数据元素遵循后进先出LIFO(Last In First Out)的原则。压栈(push):栈的插入操作叫做进栈/压栈/入栈,入栈数据在栈顶。出栈(pop):栈的删除操作叫做出栈。出数据也在栈顶。2.栈实现2.1栈结构typedef int StackDataType;typedef struct Stack{ StackDataTy.
2021-10-23 16:10:36
1264
13
原创 【咬文嚼字】C语言中你可能不知道的小知识(3)
前言c语言萌新在学习完一些基本语句后,就能写出一些小的c语言程序了,但在写的过程中可能总是会碰到一些小地方困扰着你,因此我决定将我切身犯过的每一个问题和遇到的困惑归纳,并用文章的形式记录分享,希望看到此文的你能从中有所收获。注:代码运行环境为(VS),不同运行环境结果可能有所不同。一、容易忽略的运算符优先问题请问以下代码在屏幕上输出什么?int main(){ int c; while (c = getchar() != EOF) putchar(c); return 0;
2021-10-06 19:39:49
645
15
原创 【学习笔记】单链表(c语言)
1.单链表概念单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(s数据元素的映象) +指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。2.链表分类链表的结构多种多样有三个大分类:1.单向、双向2.带头、不带头3.循环、不循环而三组之间又可以互相组合,使得链表的结构多达8种,本篇的单链表主要是指单向不带头不循环链表,这也是本篇的重点。2.1单向链表单向
2021-10-03 21:24:32
721
13
原创 【学习笔记】顺序表(c语言)
顺序表概念顺序表是用以一段物理地址连续的存储单眼依次存储数据元素的线性结构,一般情况采用数组存储。在数组上完成数据的增删查改。顺序表一般分为静态顺序表和动态顺序表,这里主要讲如何实现动态顺序表。顺序表分类静态顺序表动态顺序表...
2021-09-25 18:52:46
789
12
原创 【咬文嚼字】c语言中你可能不知道的小知识(2)
前言作为一名c语言萌新,在学习完c中的基本语句后,就能写出一些小的c语言程序了,但在写的过程中可能总是会碰到一些小地方困扰着你,因此我决定写下这篇文章记录下我遇到的一些小问题帮助你查漏补缺,并扫清那些你记忆中模棱两可的地方。一、printf请问一下代码在屏幕上输出什么#include<stdio.h>int main(){ int a = 12; printf("*%d*\n", a); //用两个'*'知识为了方便给
2021-09-23 22:56:33
373
15
原创 【咬文嚼字】c语言中你可能不知道的小知识
前言作为一名c语言萌新,在学习完c中的基本语句后,就能写出一些小的c语言程序了,但在写的过程中可能总是会碰到一些小地方困扰着你,因此我决定写下这篇文章记录下我遇到的一些小问题帮助你查漏补缺,并扫清那些你记忆中模棱两可的地方。一.Switch与case请问以下代码在屏幕上输出什么?#include<stdio.h>int main(){ int n = 1; switch (n) { case 1: printf("%d ", 1); case 2:
2021-09-14 16:35:15
560
13
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人