- 博客(118)
- 收藏
- 关注
原创 《数据结构笔记六》队列 ⭐⭐⭐
通过代码实现和理论分析,可以更深入地理解队列在算法和系统开发中的应用价值。:通过限制操作位置(队尾入队、队首出队),强制实现FIFO逻辑。:队列适用于需要“顺序处理”的场景,如任务调度、数据缓冲等。指针到达数组末尾后即使前面有空位也无法继续入队(假溢出)。当队列满时,可分配更大的数组并迁移数据(例如容量翻倍)。:判断队列是否已满(仅限固定容量队列)需要快速访问和固定容量时选择数组实现。入队时检测队列满,出队时检测队列空。)实现指针循环,复用空闲空间。:操作系统中的进程就绪队列。:元素出队(移除队首元素)
2025-05-28 13:57:18
244
原创 《数据结构笔记四》双链表:创建,插入(头插、尾插、中间任意位置插入),删除,遍历,释放内存等核心操作。
运行该程序时,可以通过双向打印验证链表结构的正确性,同时所有内存操作都经过安全处理,避免常见的内存泄漏问题。5. 编写在任意位置插入的函数(比如指定位置索引)。6. 编写删除节点的函数(按位置或按值)。验证无效位置输入(负数、超长位置)每个动态分配的节点都会被正确释放。测试用例覆盖头/尾/中间操作场景。9. 主函数中测试这些操作。2. 编写创建节点的函数。7. 编写遍历链表的函数。8. 编写释放链表的函数。处理空链表插入/删除操作。3. 编写头插法函数。4. 编写尾插法函数。:双向遍历验证链表结构。
2025-05-27 16:46:20
305
原创 《数据结构笔记二》:顺序表
用一组连续的内存单元依次存储线性表的各个元素,也就是说,逻辑上相邻的元素,实际的物理存储空间也是连续的。线性表中的元素个数n(n>=0),定义为线性表的长度,当n=0时称之为空表。由n(n>=0)个数据特性相同的元素构成的有限序列,称为线性表。线性表是n个数据元素的有限序列,其中n个数据的是相同的数据类型。除最后一个元素外,结构中的每一个数据元素均只有一个后继。除第一个元素外,结构中的每一个数据元素均只有一个前驱。存在唯一的一个被称之为 “最后一个” 的数据元素。查找的这个元素的位置为:1。
2025-05-22 18:42:37
285
原创 《数据结构笔记一》: 指针、结构体、动态内存分配、算法时间复杂度。
编写一个函数,传入两个int参数,在函数创建一个结构体point类型的变量。将传入的两个参数分别赋值给该结构体变量的x和y,最后将该结构体变量返回。随着问题规模n的增大,算法执行时间和增长率和f(n)增长率成正比。结构体是一个或多个变量的集合,这些变量可以是不同的类型。可以看到 取 *p地址输出的是数组的首位元素。那如果想取数组的其他元素呢?c程序编译后,会以三种形式使用内存。在C语言中,动态分配内存的基本步骤。评价算法好坏的基本标准。结构体的初始化与调用。
2025-05-22 14:35:07
782
原创 在c/c++中,如何使用链表进行插入、删除和遍历功能。
处理头节点删除和中间节点删除两种情况。依次插入3个节点(1→2→3):释放链表内存,避免内存泄漏。:存储节点值(此处为整型)使用二级指针修改头节点指针。:指向下一个节点的指针。:在链表头部插入新节点。分步删除节点并打印结果。时间复杂度:O(1)时间复杂度:O(n)
2025-05-16 16:55:38
655
原创 在Linux中如何使用Kill(),向进程发送发送信号
以上代码通过 kill()函数向指定进程发送 SIGINT 信号,可通过外部传参将接收信号的进程 pid 传入到程序中,再执行该测试代码之前,需要运行先一个用于接收此信号的进程.
2025-05-14 16:12:33
331
原创 在linux中,如何使用malloc()函数向操作系统申请堆内存,使用free()函数释放内存。
如果分配内存失败(譬如系统堆内存不足)将返回 NULL,如果参数 size 为 0,返回值也是 NULL。二、free()函数原型。
2025-05-14 11:58:13
314
原创 在Linux中使用 times函数 和 close函数 两种方式 打印进程时间。
times函数用于获取当前进程的时间信息,其原型为clock_t times(struct tms *buf),需包含头文件<sys/times.h>。该函数将时间信息存储在struct tms结构体中,参数buf指向该结构体。返回值类型为clock_t,表示从系统启动到当前时刻的时钟滴答数,可通过除以节拍率转换为秒数。若调用失败,返回-1并设置errno。struct tms包含用户CPU时间、系统CPU时间及子进程的相关时间。示例代码展示了如何使用times函数测量代码段的执行时间,并输出用
2025-05-13 15:51:25
386
原创 在Liunx中,使用stat 函数获取文件的相关信息。(详细)
struct stat 是内核定义的一个结构体,在<sys/stat.h>头文件中申明,所以可以在应用层使用,这个结构体中的所有元素加起来构成了文件的属性信息。通过 stat(), fstat(), 或 lstat() 系统调用获取。它记录了文件的类型、权限、大小、时间戳等信息。
2025-04-29 14:25:51
433
原创 在Linux中,如何使用系统调用fsync()将参数fd所指的文件数据和元数据写入磁盘?
将文件描述符fd关联的文件数据及其元数据(如修改时间、权限等),确保数据在系统崩溃或断电后不会丢失。fd是已打开文件的描述符(通过open()获取)。成功时返回0。失败时返回-1,并设置errno表示错误原因(如EBADFEIO等)
2025-04-28 11:04:58
724
1
原创 在Linux中,使用标准IO库,进行格式化IO操作
作用:将格式化数据输出到标准输出(stdout)。示例: 作用:将格式化数据输出到指定的文件流(如文件、标准错误流)。示例: 作用:将格式化数据输出到文件描述符指定的文件(需包含 )。示例: 作用:将格式化数据写入字符数组中。风险:不检查缓冲区大小,可能导致溢出。示例: 作用:安全版的,指定缓冲区大小防止溢出。示例: 输入函数 作用:从标准输入(stdin)读取格式化数据。示例: 2.作用:从文件流中读取格式化数据。示例: 作用:从字符串中解析格式化数据。
2025-04-27 14:53:34
201
原创 在Linux中使用ferror()函数和feof()函数判断文件是否读取成功,或者读取指针是否到达了文件末尾?
检测文件流是否到达了文件末尾(End-of-File, EOF)。:检测文件流是否发生了读写错误(如磁盘损坏、权限不足等)。
2025-04-27 14:00:19
257
原创 在Linux中,使用IO标准库进行读写操作。
【代码】在Linux中,使用IO标准库进行读写操作。使用到的函数有:fopen()、fwrite()、fseek()、fread()、fclose()
2025-04-27 13:35:46
179
原创 在Linux中使用fcntl函数和ioctl函数
(File Control)用于操作文件描述符(file descriptor)的属性或行为,提供对文件或设备的通用控制接口。,提供与硬件设备或内核驱动交互的接口。控制摄像头、打印机、磁盘等设备的底层行为(如调整分辨率、弹出光盘)。管理文件的记录锁(文件区间锁),防止多进程竞争。的参数和命令需严格参考设备文档或内核头文件(如。(如设置串口波特率、网络接口参数),必须用。修改终端参数(如波特率、数据位)。(如非阻塞模式、文件锁),优先用。修改文件描述符的阻塞模式(如。示例二 ioctl函数。
2025-04-27 13:29:57
428
原创 在Linux中,使用read函数去读取写入文件空洞部分时,读取出来的内容是什么?为什么这样操作,以及应用场景?
使用 `read` 函数读取文件空洞(hole)部分时,读取到的内容会被系统填充为 `'\0'`(即零字节)。文件空洞是稀疏文件中未实际分配磁盘空间的区域,但逻辑上表现为连续的零字节。- 空洞部分不会占用实际磁盘空间(通过 `du -h hole_file` 可验证),但逻辑上表现为连续的零字节。- 例如,上述示例文件的总逻辑大小为 `5 + 10MB + 5`,但物理大小仅约为 `10KB`(取决于文件系统)。- 使用 `read` 读取空洞时,系统会返回零字节填充的缓冲区,与普通未初始化内存不同。
2025-04-23 12:16:45
321
原创 printf 函数,常用的格式化输出样式
函数用于格式化输出,它允许你指定不同的格式说明符来控制输出的格式。这些格式说明符可以与各种标志、宽度、精度和长度修饰符组合使用,以实现更复杂的格式化输出。表示打印一个有符号整数,并用前导零填充到至少8位宽;表示打印浮点数并保留两位小数。
2024-10-30 15:38:02
391
原创 C语言中一般内存溢出的情况
在C语言中,内存溢出(Memory Overflow)通常指的是程序尝试写入的数据超过了为其分配的内存空间。这通常发生在数组操作中,当程序试图访问数组之外的内存时,就可能发生内存溢出。内存溢出是一个严重的安全问题,因为它可能导致程序崩溃、数据损坏,甚至可能被恶意利用来执行任意代码。5.不正确的内存释放:在释放内存后没有将指针设置为NULL,然后将再次使用该指针。2.错误的内存分配:在动态分配内存时,没有正确计算所需的内存大小。4.缓冲区溢出:向一个固定大小的缓冲区写入过多的数据。
2024-10-24 17:53:04
645
原创 嵌入式系统---看门狗
在嵌入式系统中,看门狗定时器(Watchdog Timer,WDT)是一种常用的机制,用于检测和恢复系统在异常情况下的故障。如果系统因为某种原因(如软件死循环)而变得无响应,看门狗定时器可以自动重启系统,从而防止系统长时间处于不可用状态。要“关闭”看门狗定时器,通常意味着停止喂狗,让看门狗定时器超时并触发重启。在某些系统中,可能需要特殊的操作或权限来完全禁用看门狗定时器,这通常不推荐在正常运行的系统中进行,因为它会降低系统的可靠性和稳定性。如果系统出现问题,没有及时喂狗,看门狗定时器就会超时并触发重启。
2024-10-15 16:06:59
1749
原创 C语言的32个关键字
2. **break**: 立即退出最近的 `for`、`while` 或 `do-while` 循环。25. **static**: 声明静态变量或函数,具有限制的作用域和持久的生命周期。10. **else**: 与 `if` 配合使用,表示“否则”执行的代码块。27. **switch**: 条件语句,允许基于不同的情况执行不同的代码块。7. **default**: 用于 `switch` 语句,表示默认选项。3. **case**: 用于 `switch` 语句中,表示一个选项。
2024-07-05 11:27:43
580
原创 C语言标准库中的函数
`strncpy`: 复制一个字符串到另一个字符串,最多复制指定数量的字符。- `strncat`: 将一个字符串的部分添加到另一个字符串的末尾。- `strstr`: 查找一个字符串在另一个字符串中首次出现的位置。- `strcat`: 将一个字符串添加到另一个字符串的末尾。- `strchr`: 查找字符串中第一次出现指定字符的位置。- `strtok_r`: 可重入版本的 `strtok`。- `strcpy`: 复制一个字符串到另一个字符串。
2024-07-05 11:24:55
405
原创 IO口的工作方式:上拉输入、下拉输入、推挽输出、开漏输出
推挽电路使用两个参数相同的以推挽方式存在于电路中,两只对称的开关管每次只有一个导通,所以导通损耗小、效率高,输出既可以向负载灌电流,也可以从负载抽取电流。开漏输出的特点是可以允许多个设备共享同一个总线或信号线,通过合理的电平控制,实现对总线或信号线的协调使用,避免冲突和干扰。上拉输入是指将信号通过一个电阻连接到高电平(通常是Vcc),并通过一个触发器将不确定的信号嵌位在高电平。上拉输入和下拉输入的主要区别在于信号的来源和电平状态,需要根据具体的应用场景和电路设计需求选择合适的配置方式。
2024-01-31 15:36:35
6914
原创 C/C++中,头文件加双引号 “ ” 与加尖括号 <> 的区别
需要注意的是,双引号和尖括号可以用于包含任何头文件,但是它们的查找路径不同。在C语言中,双引号(" ")和尖括号(< >)在头文件中的使用有一些区别。而在使用尖括号包含标准库的头文件时,编译器会按照标准的包含路径进行查找。在使用双引号包含头文件时,编译器首先会在当前目录中查找;
2023-12-15 14:49:13
1915
原创 DB9串口引脚介绍
DB9串口是一种常见的串行通信接口,它包含9个引脚,用于发送和接收数据。注:管脚定义中公头和母头有一些区别,公头的2引脚是RXD,母头的2引脚是TXD。一、公头和母头 图片示意源于网络。二、 每个引脚的功能定义。
2023-11-18 14:39:21
6117
原创 C++指针【2】复合类型的声明
2.解引用int型指针会得到一个int型的数,同样解引用指向指针的指针,会得到一个指针。此时为了访问最原始的那个对象,需要对指针的指针做两次解引用。// r 引用了一个指针,因此给 r 赋值 &i 就是令 p 指向 i;//解引用 r 得到 i ,也就是 p 指向的对象,将 i 的值改为 0;引用本身不是一个对象,因此不能定义指向引用的指针。面对一条比较复杂的指针或引用的声明语句时,从右向左阅读有助于理清它真正的含义。//r是一个指针p的引用。//p是一个int型的指针。
2023-11-02 14:40:37
201
原创 嵌入式笔试【1】
栈溢出问题:每当一个函数被调用时,操作系统会为该函数创建一个新的栈帧,以存储该函数的局部变量和参数等。递归函数在深度过深的情况下,会导致系统栈空间被快速耗尽,从而引发栈溢出错误。时间和空间效率低下:对于深度递归,系统需要频繁地创建和销毁栈帧,这会消耗大量的CPU时间和内存。如果递归深度过深,或者递归算法本身就不高效,那么这种时间和空间效率的消耗会变得非常明显。可读性和可维护性降低:深度递归可能会使得代码难以理解和维护。
2023-11-02 11:54:07
258
原创 c++指针【1】
利用 void*指针能做的事儿比较有限:拿它和别的指针比较、作为函数的输入或输出,或者赋给另外一个void*指针。在C++中,你不能将一个类型的地址直接赋给另一个类型,除非它们是兼容的类型。例如,如果你有一个指向整数的指针,你可以将它转换为指向字符的指针(因为一个字符的大小和一个整数的大小通常是一样的),但你不能将它转换为指向长整数的指针。虽然它们的位数不同,但它们的对齐要求可能不同,也就是说,它们的内存模型可能不同。void*是一种特殊的指针类型,可用于存放任意对象的地址。
2023-10-28 16:59:33
145
原创 C++ Primer 11 术语表【1】生僻词释义
(buffer)是计算机内存中的一段区域,用于临时存储数据,以使数据能够在不同的速度或不同的时间进行传输或接收。一个ostream对象,关联到标准错误,通常写入到与标准输出相同的设备。默认情况下,写到cerr的数据是不可缓冲的。一个ostream对象,关联到标准错误,默认情况下,写到clog的数据是被缓冲的。(operator)。左侧运算对象必须是一个类类型对象,右侧运算对象必须是此对象的一个成员的名字。(parameter list)函数定义的一部分,指出调用函数时可以使用什么样的实参,可能为空列表。
2023-10-24 11:27:40
106
原创 C++:类型int、long、long long和short的区别;无符号 类型和带符号类型的区别;float和double的区别。
利率:利率通常是一个小数,表示每年借款成本的百分比。例如,如果贷款的年利率为5%,那么在计算时,应将这个数字以小数形式存储或计算,即0.05。付款:付款通常包括两部分,一部分是本金的一部分(通常称为本金偿还),另一部分是利息。这两部分通常都是以小数形式表示的,因此在进行付款计算时,应选择小数类型。本金:本金是贷款的原始金额,通常以整数形式表示。例如,如果贷款金额为100,000元,则应使用整数类型(如int或long等)来存储这个值。付款:小数(例如float或double)
2023-10-24 11:22:59
1845
原创 C++ 读取数量不定的输入数据
在C++中,有时我们会遇到,在事先没有知道,要对多少个数,进行求和的情况下,这就需要不断的读取数据直至没有新的输入为止。
2023-10-23 12:24:50
835
原创 C++中常见的头文件
这些头文件是由C++标准库提供的,每个头文件都包含一系列函数、类、常量等定义。当然,除了这些标准库头文件外,用户也可以自定义头文件,用于组织自己的代码。在C++中,头文件被广泛使用,用于包含函数声明、常量定义、类定义等。一般情况下,头文件包含在源文件的开头部分,这样源文件就可以访问头文件中定义的内容。C++中的头文件可以包含各种函数声明,这取决于头文件的目的和用途。
2023-10-18 15:30:54
1936
原创 C++中的函数
函数可以返回任何类型的数据,包括整数、浮点数、字符、布尔值、结构体,甚至可以是其他函数或类的对象。在C++中,函数是程序的一部分,它执行特定的任务。函数可以带有任意数量的参数,也可以没有任何参数。是传递给函数的参数的类型和名称的列表,,并且函数返回一个整数。是函数执行其任务的语句。在这个例子中,函数名是。
2023-10-18 13:47:58
142
原创 C++链接器如何工作,以及变量的表达
在C++中,作用域可以是全局的或局部的。全局变量在整个程序中都可用,而局部变量仅在其被声明的函数或代码块中可用。链接器还会检查所有的目标文件和库文件,确保没有重复的符号(例如,两个不同的函数或变量使用了相同的名称)。C++链接器是用于将编译后的目标文件(.o文件)连接在一起,生成可执行文件的过程。此外,链接器还会添加一些启动代码(startup code)到最终的可执行文件中,这些代码包含了程序的入口点(通常是。在C++中,你需要先声明一个变量,然后才能使用它。在C++中,变量是用于存储数据的容器。
2023-10-18 12:23:21
234
原创 Edge---微软浏览器-兼容性问题-解决办法(详细)
最后重启 MicrosoftEdge 浏览器,开始enjoy......在Microsoft文件夹右侧(鼠标右击),新建一个。在Edge文件夹右边界面空白部分,鼠标右键。
2023-10-17 16:24:12
2630
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人