- 博客(176)
- 资源 (30)
- 问答 (6)
- 收藏
- 关注
原创 C语言---安全函数
在C语言中,安全函数是针对传统标准库函数在内存和字符串操作中缺乏边界检查而设计的增强版本,旨在减少缓冲区溢出、未初始化变量访问等常见安全漏洞。C11 标准引入了一些安全函数,也称为 Annex K 标准库函数。这些安全函数主要是标准字符串和内存操作函数的增强版本,通过增加参数(如缓冲区大小)来提供更好的错误检测和处理。安全函数在 Visual Studio 等编译器中得到较好的支持,但在一些较老版本的编译器中可能不可用,需要注意兼容性。
2026-01-26 21:49:00
267
原创 win11系统查看设备配置
点击WIN按键,搜索"系统",选择下方的"系统信息"。点击"系统",可以看到很多配置相关的内容。点击"此电脑" -> “属性”按下按键"win + R"存在大量系统相关配置。输入"winver"
2026-01-26 20:59:33
148
原创 win11系统分盘2
更改驱动号和路径:可以修改磁盘的名称。但是无法修改C盘名称。每个电脑起码有一个C盘。右键点击windows按键如下,选择磁盘管理。压缩卷即将磁盘缩小,对于空间可分配至其他卷。下图选项中,输入压缩空间量即想要缩小的空间。删除卷:删除当前磁盘,C盘无法删除。当出现未分配空间时,可设置新建卷。右键点击你需要修改的磁盘。扩张卷:增加磁盘内存容量。压缩卷:缩小磁盘内存容量。
2026-01-26 20:33:51
31
原创 Vs Code创建---代码统计工具
VS Code Counter 是 Visual Studio Code 的一款扩展工具,主要用于统计源代码的物理行数、空白行数和注释行数,支持多种编程语言,并提供了灵活的统计方式和可视化报告功能。
2026-01-21 22:12:33
588
原创 C语言---命令行参数
在C语言中,命令行参数是通过main函数的两个特殊参数传递的:int argc和char *argv[]。这两个参数允许程序在启动时接收来自命令行的输入。
2026-01-20 22:53:48
390
原创 C语言---未定义行为
1、标准定义:C标准(如C11)明确列出“未定义行为”清单(如访问无效指针、修改字符串常量)。标准仅规定“此类行为无要求”,不约束编译器实现。2、编译器自由:不同编译器(GCC、Clang、MSVC)对UB的处理可能截然不同。例如:悬空指针访问:可能崩溃、返回垃圾值,或“巧合”正确。整数溢出:有符号整数溢出是UB(如int x=INT_MAX;x++;),编译器可能直接删除此类代码(因“结果无意义”)。
2026-01-19 22:15:07
757
原创 C语言---可变参数
C语言中的可变参数(Variadic Functions)允许函数接受不定数量的参数,这一特性在需要处理动态数量参数的场景中非常实用,例如格式化输出函数(如printf)、日志记录、数学计算等。C语言通过<stdarg.h>头文件提供了一套宏来支持可变参数的处理。
2026-01-18 15:00:29
533
原创 C语言---递归
递归是C语言中处理自相似问题的强大工具,但需谨慎设计基例和递归步骤,避免栈溢出和性能问题。在深度可控或问题天然递归(如二叉树遍历)时优先使用;若深度过大或性能敏感,可考虑迭代或动态规划优化。
2026-01-14 22:27:49
397
原创 C语言---错误处理
使用枚举或宏定义错误码,避免硬编码(如-1、1等)。方法适用场景优点缺点返回值检查简单函数调用明确、直接需手动检查每个调用errno +错误码标准库函数错误与系统集成好 多线程不安全断言调试阶段逻辑错误快速定位问题发布版本需禁用信号处理严重运行时错误(如段错误)捕获致命错误复杂,可能掩盖问题深层嵌套错误恢复跨函数跳转易导致资源泄漏,代码难维护。
2026-01-13 22:54:48
854
原创 C语言---强制类型转换
在C语言中,强制类型转换(Type Casting) 是显式将一种数据类型转换为另一种数据类型的操作,通过在表达式前添加目标类型的括号实现。它是C语言类型系统的核心特性,但需谨慎使用以避免未定义行为或数据丢失。
2026-01-13 21:05:52
776
原创 C语言---头文件
/ main.c#include "myheader.h" // 引入自定义头文件");return 0;头文件中定义全局变量可能导致重复定义错误。// 声明// 定义标准库头文件用尖括号 < > 包含(如 #include <stdio.h>),编译器从系统路径查找。自定义头文件用双引号 " " 包含(如 #include “myheader.h”),编译器先从当前目录查找。
2026-01-13 08:03:48
636
原创 C语言---预处理器
这是预处理器最强大的功能,用于定义常量和宏函数。#define PI 3.14159 #define MAX_BUFFER 1024 // 注意:预处理器不会检查类型,只是简单的字符串替换⚠️ 重要陷阱:必须给参数和整体加括号!错误写法:#define SQUARE(x) x * x如果调用 SQUARE(2+3),展开后变成 2+3*2+3 = 11(而不是25)。正确写法:((x) * (x)) 能保证运算优先级正确。用于取消已定义的宏。
2026-01-12 23:30:39
768
原创 C语言---缓冲区
可以在 fopen 之后、进行任何读写之前,修改缓冲模式。// 自己分配一块内存作为缓冲区// 设置为行缓冲,使用我自己的数组作为缓冲区// 或者完全禁用缓冲fclose(fp);return 0;1、打开 (fopen):系统分配一块内存(通常4KB/8KB)。2、写入 (fprintf/fwrite):数据先拷贝到这块内存,不触及磁盘。3、刷新 (fflush/\n/满/fclose):系统调用 write() 将内存数据拷贝到内核,内核再写入磁盘。
2026-01-12 22:45:21
652
原创 C语言---文件读写
C语言的文件读写(File I/O)是C标准库(stdio.h)提供的一套强大功能,用于在程序和外部文件(如txt、dat、csv等)之间传输数据。以下是C语言文件操作的核心知识体系,包含基本概念、常用函数、操作模式和完整示例。
2026-01-11 23:26:20
985
原创 C语言---printf函数使用详细说明
printf 函数的格式控制字符串是 C 语言中最强大也最复杂的工具之一。其完整语法格式为:%[标志][最小宽度][.精度][长度修饰符]类型符。
2026-01-11 18:53:25
688
原创 C语言---typedef
为了提高代码的可移植性,常用 typedef 定义固定长度的整型。这样在不同位数的 CPU 上,只需修改 typedef 的定义,而不需要改动逻辑代码。函数指针的原始语法非常晦涩,使用 typedef 可以极大提高可读性。// 定义一个名为 Handler 的别名,它是一个函数指针// 该函数接收两个 int 参数,返回一个 int// 使用别名定义函数指针变量return 0;
2026-01-11 18:14:17
288
原创 C语言---无名位域
在 C 语言中,**无名位域(Unnamed Bit-fields)**是指在结构体中定义位域时,不给该成员命名。它主要有两种用途:填充(Padding)和强制对齐(Alignment)。
2026-01-11 17:54:59
420
原创 C语言---位域
位域(Bit-fields)是 C 语言中一种特殊的数据结构,允许在结构体中以“位”为单位来指定成员所占用的内存空间。这在处理底层硬件寄存器、协议解析或需要极度节省内存的场景中非常有用。
2026-01-11 17:16:48
325
原创 C语言---共用体
/ 先定义模板,再声明变量int i;float f;// 定义模板的同时声明变量int i;float f;// 使用 typedef 起别名int i;float f;} Value;Value v1;// 直接使用别名声明。
2026-01-07 23:02:01
398
原创 C语言---字符串
在C语言中,有两种主要方式来定义字符串:这是最常见的定义方式。编译器会自动在末尾加上 \0。1.2、字符串常量(指针方式)使用指针指向一个存放在只读数据区的字符串。注意:通过这种方式定义的字符串通常是只读的,修改它的内容可能会导致程序崩溃。作用:C语言不记录字符串的长度,只靠 \0 来判断字符串在哪里结束。内存占用:字符串 “Hi” 包含 2 个可见字符,但实际在内存中占用 3 个字节的空间(‘H’, ‘i’, ‘\0’)。C语言在标准库 <string.h> 中提供了一系列处理字符串的函数:(1)
2026-01-03 20:37:35
383
原创 C语言---函数指针和回调函数
在C语言中,函数名本身就代表了该函数在内存中的起始地址。函数指针就是一个变量,它存储了这个地址。返回值类型 (*指针变量名)(参数类型列表);注意:(*指针变量名) 必须加括号,否则会变成一个返回指针的函数声明。示例代码// 1. 定义一个函数指针 p,指向返回值为int,有两个int参数的函数// 2. 将 add 函数的地址赋给 pp = add;// 3. 通过指针调用函数(两种写法均可)// 常用写法// 显式解引用写法return 0;
2026-01-03 17:00:31
369
原创 C语言---指针
定义指针时,使用 * 符号表示该变量是一个指针。int a = 10;// 普通整型变量int *p;// 定义一个指向整型数据的指针变量 pp = &a;// 将变量 a de 地址赋值给 p(& 是取地址符)效率:传递指针比传递大型结构体或数组快得多(只需复制 4 或 8 字节的地址)。动态性:支持在运行时分配内存。底层操作:可以直接访问硬件地址或处理复杂的链表、树等数据结构。
2026-01-03 13:59:28
424
原创 C语言---枚举变量
枚举通过关键字 enum 定义,其成员默认从 0 开始递增。先定义枚举类型,再定义枚举变量enum DAY {定义枚举类型的同时定义枚举变量enum DAY {省略枚举名称,直接定义枚举变量enum {你可以手动指定枚举成员的值。如果某个成员未指定,它将比前一个成员大 1。SLEEP = 1,STOP, // 自动变为 6ERROR = -1。
2026-01-03 13:40:05
464
原创 C语言---数组
定义数组时需要指定元素类型和元素个数。// 1. 定义但不初始化(值是随机的)// 2. 定义并完全初始化// 3. 部分初始化(剩余元素自动补 0)// 结果为 {1, 2, 0, 0, 0}// 4. 自动推断长度// 编译器自动设长度为 3。
2026-01-03 12:38:16
322
原创 C语言---局部变量、全局变量、静态局部变量、静态全局变量
在C语言中,这四种变量的主要区别在于作用域(Scope)、生命周期(Lifetime)以及存储位置。
2026-01-03 12:11:24
393
原创 python---pip路径问题
博主发生改错误的原因是,python从3.7版本升级到3.11版本,python的系统环境路径不会自动发生变化,即使将原来的路径进行修改。删除python,删除系统环境变量,重启电脑。再次重新下载所有环境。从报错学习可以看出,pip工具在寻找可执行文件时发生错误。
2026-01-01 18:24:32
142
原创 python---进程
Python中的多线程无法利用多核优势(参考文章python—线程),如果想要充分地使用多核CPU的资源,需要使用多进程。进程是操作系统进行资源分配和调度的基本单位。每个进程都有自己独立的内存空间、代码段、数据段和堆栈段。进程的启动和销毁的代价是比较大。进程间的任务切换也是开销最大的。
2025-12-30 23:15:21
998
原创 python---锁、可重入锁
释放锁时,计数器减1。5、锁的释放是在 outer() 函数的 with lock 块结束时才发生的,而 outer() 又在等待 inner() 返回。4、由于这个锁已经被当前线程(即自己)持有了,inner() 的 with lock 会一直阻塞,等待锁被释放。Lock(普通锁):同一个线程在已经获得锁的情况下,不能再次获取,否则会导致死锁。RLock(可重入锁):同一个线程在已经获得锁的情况下,可以再次获取,不会死锁。3、inner() 退出 with 块,释放锁,计数器从 2 变回 1。
2025-11-23 20:52:12
448
原创 python---线程
Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条计步(ticks)(也可以认为是虚拟机指令或字节码),解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。线程是无序的,启动了线程A,然后紧接着启动了线程B。
2025-11-23 20:44:00
934
原创 AT命令的由来
由于这些命令通常以“AT”开头,所以被称为AT命令,这个“AT”前缀告诉设备要执行一个命令。由于贺氏调制解调器在早期非常成功和流行,其他制造商为了兼容性,也纷纷采纳了这一命令集。目前在市场上有很多通用的DTU模块都使用AT命令,无论是BLE、BT、LOAR、4G、WIFI,很多都使用AT命令。对于DTU模块而言,AT命令只是串口通信中包的格式,那为什么不是其他的字母开头,而是AT呢?模块都使用AT作为命令前缀,是因为AT命令源于调制解调器早期发展,“AT”表示“Attention”(注意)。
2025-11-08 09:33:47
208
原创 python---生成器
生成器是一个返回生成器迭代器的函数,它使用yield语句而不是return来返回值。当生成器函数被调用时,它返回一个生成器对象,但不会立即执行函数体。
2025-10-22 21:31:57
283
原创 C语言---函数
1、函数声明(函数原型)作用:告诉编译器函数的名称、返回类型和参数列表。这样编译器在遇到函数调用时,就知道如何检查调用的正确性。格式:返回类型 函数名(参数类型列表);注意:参数名在声明中是可选的,但类型必须写明。也是合法的声明。位置:通常在源文件的开始处或头文件(.h)中。2、函数定义作用:包含函数实际的代码实现。格式:即上面介绍的完整格式,包含函数体。3、函数调用作用:在程序中使用函数的功能。格式:函数名(实际参数);过程:程序执行到函数调用时,会暂停当前函数。
2025-10-16 21:53:55
796
原创 python---迭代器、可迭代对象
定义一个类来实现迭代器协议(即实现iter() 和next() 方法)。例子:创建一个返回数字平方的迭代器# __iter__ 必须返回迭代器对象,因为自己就是迭代器,所以返回 self# 使用print(num)# 输出: 1, 4, 9, 16概念描述关键点可迭代对象数据的容器/来源有iter() 方法,可被 for 循环遍历迭代器迭代的执行者有iter() 和next() 方法,惰性、一次性关系for 循环通过调用可迭代对象的iter。
2025-09-21 19:43:59
952
原创 C语言---goto语句
goto 语句是一种无条件跳转语句,它用于将程序的控制流无条件地转移到同一函数内的某个指定标签(Label)处。它的存在历史悠久,在早期的结构化编程语言中很常见,但在现代编程实践中,由于其可能带来的问题,通常不建议使用。
2025-09-14 12:03:36
1244
tesseract-ocr-w64-setup-v5.1.0.20220510
2025-10-15
mingw64 win64环境下的C语言编译器
2025-07-16
微生物学-引物设计-Primer Premier 5.0
2025-05-11
微生物学-引物设计-DnaMan
2025-05-11
Gradio运行时出现ERROR
2025-10-25
LORA芯片的低功耗设计
2024-12-27
FLASH手册描述问题
2024-12-26
BLE被动扫描的用处是什么?
2024-12-13
strcpy和memcpy的区别
2024-05-16
单片机测量500KHZ方波
2023-11-30
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅