- 博客(48)
- 收藏
- 关注
原创 C++ 第一阶段 数组与字符串 - 第三节:字符串操作函数(string.h)
string.h是C标准库中处理C风格字符串(以\0结尾的字符数组)的核心头文件。本文详细解析了11个关键函数:包括strlen计算长度,strcpy/strncpy字符串复制,strcat/strncat字符串拼接,strcmp/strncmp字符串比较,以及strchr/strrchr/strstr字符查找等。特别强调了安全性问题,如缓冲区溢出风险及手动添加终止符的必要性。通过对比C风格字符串与C++中std::string的特性差异,指出前者在底层操作和性能上的优势,以及在内存管理上的风险。
2025-06-20 08:37:14
139
原创 C++ 第一阶段 数组与字符串 - 第二节:C风格字符串(char*)与 std::string
C风格字符串(char*)以空字符结尾,需手动管理内存,操作依赖C库函数,安全性较低但性能好;std::string是C++标准类,自动管理内存,提供丰富成员函数,内置越界检查,安全性高但可能有动态扩容开销。主要区别体现在内存管理、安全性、功能性和适用场景:C风格更适合嵌入式系统和高性能需求,而std::string是现代C++项目的首选,特别适合需要频繁字符串操作的场景。二者可互转,但需注意常见错误如缓冲区溢出和越界访问。建议优先使用std::string,同时理解底层原理以兼容不同场景需求。
2025-06-20 08:36:44
310
原创 C++ 第一阶段 数组与字符串 - 第一节:原生数组 vs std::array
原生数组是C++基础数据类型,栈上分配,但缺乏安全性和STL兼容性,传递时易退化为指针。std::array(C++11引入)封装原生数组,提供类型安全(如at()越界检查)、STL接口(size()、迭代器)和参数传递时的长度保留。两者均需编译期确定大小,性能接近,但std::array更推荐用于现代C++,因其安全性高且与STL算法兼容。原生数组仅适用于性能敏感或与C代码交互的场景。调试时建议使用at()和静态分析工具避免常见问题。
2025-06-20 06:00:00
158
原创 C++ 第一阶段 基本语法 - 第四节:控制结构详解(条件与循环)
本文详细讲解了C++中的程序控制结构,包括条件控制和循环控制两大类。条件控制部分介绍了if/else语句、else if多分支和switch语句的语法、示例及注意事项;循环控制部分阐述了for、while和do-while循环的用法特点及区别。此外还讲解了break、continue、goto等跳转语句,并强调控制结构的嵌套使用技巧。文章最后提供了常见错误分析、调试建议和编程练习(如成绩分类器、九九乘法表等),帮助读者掌握如何合理运用控制结构构建程序逻辑。
2025-06-19 10:42:57
593
原创 C++ 第一阶段 基本语法 - 第三节:输入输出流
C++提供了cin/cout和C风格的scanf/printf两种I/O方式。cin/cout更类型安全且语法简洁,尤其适合日常开发,但性能较低;scanf/printf格式化灵活、性能高,适用于竞赛编程等大规模数据处理场景。建议根据需求选择:关闭同步优化后的cin/cout性能接近C风格,但混合使用需谨慎。两者各有优势,cin/cout适合快速开发,scanf/printf更适用于效率优先的情况。
2025-06-19 10:42:31
593
原创 C++ 第一阶段 基本语法 - 第二节:运算符与表达式详解
本文深入解析C++运算符的分类与使用。主要内容包括:1)运算符优先级与结合性规则,强调括号优先原则;2)算术运算符的整数浮点混合运算、自增自减副作用;3)关系与逻辑运算符的短路特性;4)位运算的实际应用与数学意义;5)赋值运算符优化技巧。文章特别指出类型转换的精度风险、常见错误(如整数溢出)以及调试技巧,并提供了计算器实现、位运算应用等实践练习。最后建议通过实际编程、源码阅读和调试工具来巩固运算符知识,强调优先使用括号和static_cast等安全操作。
2025-06-19 06:00:00
622
原创 C++ 第一阶段 基本语法 - 第一节:变量与数据类型详解
C++变量与数据类型详解:本文系统介绍了C++中的基本数据类型及其使用。主要包含整型(int、short、long)、浮点型(float、double)、字符型(char)、布尔型(bool)以及枚举类型(enum)等,详细说明了各类型的存储空间、取值范围和典型应用场景。文章通过代码示例展示了变量声明、初始化和使用方式,特别强调了浮点数的精度问题和枚举类型的使用规范。最后提供了变量命名的规则建议,包括C++11统一初始化等现代C++特性。
2025-06-18 19:06:50
730
原创 C++ 第一阶段 基本语法 - 第五节:函数详解
参数传递:值传递(副本操作)、引用传递(直接修改原值)、指针传递(地址操作)返回值:需匹配声明类型,void类型无返回值进阶特性:函数重载(同名不同参)、默认参数、递归调用(需终止条件)特殊应用:函数指针实现回调机制,如排序算法中自定义比较逻辑调试要点:注意函数声明、参数类型匹配和递归深度控制
2025-06-18 15:49:53
821
原创 C++从入门到入土学习导航
该学习计划分为6个阶段,从基础语法到高级应用,循序渐进掌握C++开发。1)基础语法(2-4周):开发环境配置、数据类型、流程控制、函数和指针;2)OOP(3-5周):类与对象、继承多态、模板编程;3)现代特性(3周):智能指针、多线程、新标准库;4)标准库应用(3周):STL容器、内存管理、文件IO;5)高级技术(2-3周):模板元编程、设计模式、性能优化;6)项目实战:通过实际项目巩固技能,推荐经典书籍和在线资源。
2025-06-18 14:19:18
756
原创 C++中class与struct的深度对比解析
C++中class与struct的核心区别在于默认访问权限(private vs public)和默认继承方式(private vs public),尽管功能完全一致。class更适合面向对象设计和数据封装,struct则用于简单数据聚合或与C兼容的场景。示例项目通过测试默认访问权限和继承方式验证了两者的差异,建议根据实际需求选择:优先struct用于跨语言兼容,class用于强调封装。显式指定访问权限可避免默认行为带来的歧义。
2025-06-18 13:51:43
613
原创 extern关键字:C/C++跨文件编程利器
C/C++中的extern关键字用于声明变量或函数在其他文件中定义,实现多文件共享符号。在C语言中,extern可避免重复定义错误,函数默认具有extern属性,建议在头文件中声明extern变量。C++保留了这些功能,并增加了extern "C"语法来兼容C代码,关闭名称改编机制。两种语言都遵循"一次定义规则"(ODR),即变量只能在一个文件中定义。正确使用extern能有效管理多文件项目,促进模块化编程。extern "C"是C++独有的特性,专门用于C/C++混合编程场景。
2025-06-18 09:14:36
490
原创 C语言三大函数对比:strcpy VS sprintf VS memcpy
本文详细比较了C语言中strcpy、sprintf和memcpy三个常用函数的功能与特性。strcpy用于字符串复制但存在缓冲区溢出风险;sprintf可格式化输出到字符串,同样存在安全隐患;memcpy则适用于任意内存块的快速拷贝。三者均不检查目标缓冲区大小,建议使用更安全的替代版本(如strncpy、snprintf)。文章通过对比表阐明差异,强调安全使用的重要性,并给出代码示例和最佳实践建议:优先选用带长度控制的函数版本,以防止缓冲区溢出漏洞。
2025-06-17 13:40:04
789
原创 全局变量与静态变量:C/C++关键区别解析
本文对比了C/C++中全局变量与static变量的关键区别。全局变量具有外部链接性,可跨文件访问,而static全局变量仅限当前文件;static局部变量则保持函数内部作用域但持久生命周期。C++还扩展了静态类成员和匿名命名空间的使用。文章通过代码示例展示了不同变量的特性,并提供了最佳实践建议:使用static或匿名命名空间封装内部数据,静态局部变量共享函数状态,静态类成员共享对象数据。这些概念对编写模块化、安全的代码至关重要。
2025-06-17 10:46:52
814
原创 C++强制转换:安全编程的终极武器
C++提供了四种类型安全转换操作符,显著优于危险的C风格强制转换。static_cast用于编译器可验证的安全转换,dynamic_cast实现运行时多态类型检查,const_cast专门处理常量性修改,而reinterpret_cast允许底层内存重新解释。这些转换操作符通过明确语义、编译时检查和精准的转换范围控制,有效提升了代码健壮性。最佳实践建议优先使用static_cast,只在必要时使用其他转换,并尽量避免reinterpret_cast。
2025-06-17 10:04:16
1389
原创 现代C++:std::string全方位碾压C字符串
本文对比了C++的std::string与C语言的字符串类型。std::string作为现代C++的字符串类,解决了C字符串的内存管理、安全性等缺陷,提供丰富的API接口。文章从基本概念、主要区别、代码示例等多个维度展开分析,指出std::string具有自动内存管理、边界检查、丰富操作方法等优势。同时给出了使用建议,推荐在C++项目中优先使用std::string,仅在需要与C接口交互时使用char*/const char*。结论表明,std::string是更安全、更易用的现代字符串处理方案。
2025-06-16 15:25:09
1051
原创 C语言内存分配三巨头:malloc、calloc、realloc详解
C语言动态内存分配函数比较:malloc、calloc与realloc是三个核心函数,主要区别在于malloc分配未初始化内存,calloc分配并初始化为零的内存,realloc用于调整已分配内存大小。malloc适合快速分配,calloc适用于需要清零的数组,realloc用于动态扩容。使用时需检查NULL返回值,避免内存泄漏。C++建议使用智能指针替代手动内存管理。正确选择函数可提升内存管理效率和安全性。
2025-06-16 14:46:21
748
原创 C与C++中的const终极对比指南
本文对比分析了C和C++中const关键字的差异。C语言的const仅表示"只读变量",不能作为编译时常量;而C++的const具有更严格的语义,可作为编译时常量使用。主要差异体现在:指针/引用修饰、函数参数、类成员函数、链接性等方面。C++还扩展了constexpr、mutable、const_cast等特性。文章通过大量代码示例揭示了两者在全局变量、数组大小、函数重载等场景下的不同行为,并提供了最佳实践建议。掌握这些差异对编写跨语言程序和高质量代码至关重要。
2025-06-16 11:11:06
715
原创 C和C++中参数传递方式对比
C和C++中参数传递方式对比:值传递创建副本不影响原数据,适合小数据但复制开销大;指针传递通过地址修改原值,灵活但需解引用;引用传递(C++特有)直接操作原变量,语法简洁且安全。C语言仅支持前两种方式,C++推荐使用引用传递处理大型对象以避免复制。不同方式各具特点,应根据修改需求、性能和安全等因素选择合适方法。
2025-06-16 10:35:57
971
原创 函数指针与指针函数:本质区别与高级应用
函数指针与指针函数的本质区别在于:函数指针指向函数的入口地址,用于动态调用不同函数,实现回调机制和策略模式;而指针函数是返回值类型为指针的普通函数,主要用于内存管理和数据返回。文章详细分析了两者的内存机制、基础用法和高级应用,包括回调函数、函数指针数组、指针函数的内存安全规范等。在工程实践中,函数指针适合插件系统、状态机等场景,指针函数则常用于动态内存管理。开发者需注意函数指针的NULL检查、指针函数的内存生命周期管理,以及性能优化等关键问题。这两种技术的合理运用能显著提升C/C++程序的灵活性和效率。
2025-06-15 23:10:25
356
原创 C与C++异常处理机制对比
C和C++在异常处理上存在显著差异。C语言依赖手动错误处理机制:1)错误码返回;2)goto语句资源清理;3)setjmp/longjmp非局部跳转;4)宏模拟try-catch。这些方法需手动资源管理,缺乏类型安全。C++提供结构化异常处理:1)try/catch/throw语法;2)RAII自动资源管理;3)标准异常类体系;4)noexcept优化。关键区别在于:C++支持类型安全异常、自动资源释放和跨调用栈传播,适合大型项目;C语言方法更底层,适用于系统编程。
2025-06-15 06:00:00
838
原创 C与C++类型安全机制深度对比
本文对比了C和C++语言在类型安全机制上的差异。C语言类型检查较宽松,允许隐式转换和void指针,依赖程序员手动管理类型安全;C++通过严格的类型检查、安全转换操作符、模板、强类型枚举等机制增强类型安全性。在实践方面,建议C语言使用显式转换并避免野指针,而C++推荐使用智能指针和引用。总结指出,C语言适合系统编程等场景但需程序员自律,C++则通过语言机制提供更高类型安全性,适合大型应用开发。合理运用C++现代特性可显著降低类型相关错误风险。
2025-06-14 06:00:00
569
原创 C++指针陷阱:野指针、悬空指针与空指针详解
本文深入探讨C/C++指针中的三大问题:野指针(未初始化指针)、悬空指针(指向已释放内存)和空指针(NULL指针)。野指针因未初始化而指向随机地址,可能导致程序崩溃或安全漏洞;悬空指针在对象释放后仍保留旧地址,易引发Use-After-Free漏洞;空指针解引用直接导致崩溃。文章详细分析各类指针的成因、危害及检测方法,并提出防御措施:初始化指针、释放后置空、使用智能指针(C++)及静态/动态分析工具。通过典型案例展示问题场景与修复方案,强调指针安全对程序稳定性的重要性。
2025-06-13 14:53:14
627
原创 C++数组名与指向数组首元素的指针的关键区别
C/C++中数组名与指针虽在语法上相似,但存在本质区别。数组名是常量指针,包含数组大小信息,不可重新赋值或自增;而指针是变量,仅存储元素类型地址,支持自增和重新指向。关键差异体现在类型信息、赋值能力、sizeof结果和内存分配方式上。数组名在函数参数传递时会退化为指针,需显式传递数组大小。理解二者的静态/动态特性差异,可避免越界访问和内存泄漏等问题,正确应用于不同场景。
2025-06-13 10:44:43
880
原创 C/C++中const、static与宏定义对比
本文对比分析了C/C++中const、static和#define的特性差异。在C语言中,const仅表示只读变量,不具备编译时常量属性;static控制作用域和生命周期;#define是主要的常量机制。C++中const成为真正的编译时常量,static扩展了类内支持,#define主要用于宏替换。关键区别包括:C++的const默认内部链接、可作编译期常量,而C语言不具备这些特性;C++的static支持类成员。现代C++建议用const/constexpr替代宏,利用static管理类共享数据
2025-06-13 09:45:46
1031
原创 C++内存管理:new/delete vs malloc/free
C++中new/delete与malloc/free的主要区别在于:new/delete是C++关键字,具有类型安全性和自动的构造/析构调用,失败时抛出异常,且支持运算符重载;而malloc/free是C标准库函数,无类型检查,需手动计算内存大小,仅进行内存分配/释放。C++引入new/delete是为了更好地支持面向对象特性(构造/析构)、类型安全和异常处理。free释放的内存通常归还内存管理器而非直接返还操作系统,后续malloc可能复用。最佳实践推荐在C++中使用智能指针和RAII模式管理资源。
2025-06-12 16:09:13
854
原创 C/C++安全函数替代指南
本文介绍了C/C++中不安全字符串和内存操作函数的安全替代方案。这些传统函数如strcpy、gets、sprintf等容易引发缓冲区溢出等安全问题,提出了strncpy、fgets、snprintf等安全版本,并详细对比了它们的参数和使用方法。同时推荐使用C++标准库的std::string等更安全的替代方案,以及编译器警告和静态分析工具来增强安全性。文章通过具体代码示例展示了如何将不安全代码改写为安全版本,强调了边界检查和安全编程实践的重要性。最后指出应根据具体场景选择合适的替代方案,确保程序的安全和稳定
2025-06-12 14:16:48
1166
原创 栈(Stack)与堆(Heap):内存管理的核心差异与选择指南
堆和栈是两种不同的内存管理方式。栈由操作系统自动管理,采用后进先出原则,适合局部变量和函数调用,速度快但容量有限。堆需手动分配/释放,适合动态数据和跨函数共享,灵活但速度较慢且可能产生内存碎片。选择依据包括生命周期、数据大小和性能需求。现代语言如Java/Python通过垃圾回收机制自动管理堆内存,而C++可通过智能指针优化堆操作。实际开发中应优先使用栈变量,并借助工具监控内存使用情况。
2025-06-12 10:20:10
806
原创 栈帧(Stack Frame)详解
栈帧(活动记录)是函数调用时在栈上分配的内存区域,用于存储返回地址、参数、局部变量等上下文信息,保障函数调用和返回的正确性。其生命周期包括参数入栈、保存返回地址、创建新栈帧(调用时)以及恢复寄存器、释放空间和返回(销毁时)。递归调用会形成栈帧链,可能引发栈溢出,但尾递归优化可避免该问题。栈帧结构与安全密切相关,如缓冲区溢出可能覆盖返回地址导致攻击。不同架构的栈帧存在差异(如寄存器使用),调试时可借助工具(GDB)分析调用链。优化建议包括减少栈帧开销和控制栈大小,以平衡性能与安全。
2025-06-12 10:19:13
987
原创 C语言结构体内存对齐问题
内存对齐的基本原则包括成员对齐和结构体整体对齐。成员地址必须是其类型大小的整数倍(如char任意地址,int需4的倍数),结构体总大小需对齐到最宽成员类型倍数。示例展示了不同成员顺序带来的填充差异,嵌套结构体需按内部最大对齐值处理。可通过#pragmapack(n)指定对齐,但可能影响性能。内存对齐主要出于硬件限制(如ARM不支持非对齐访问)和性能优化考虑(减少CPU访问次数和缓存冲突)。合理利用对齐能提升程序效率,但需平衡内存占用与性能。
2025-06-11 15:07:05
523
原创 C语言在main执行之前和之后执行的一些操作
程序执行前后会执行一系列初始化与清理操作。在main函数执行前,操作系统会调用启动代码初始化环境,处理静态/全局变量,并执行构造函数(如GCC的__attribute__((constructor)))。main函数结束后,会执行atexit注册的清理函数(LIFO顺序)、析构函数(如__attribute__((destructor))),最后标准库完成缓冲区刷新等清理工作。整个过程确保程序资源正确初始化和释放。
2025-06-11 13:51:39
163
原创 Lora模块调试:基于亿佰特旗下的E22-400T30S
本文记录了两款LoRa模块(E22-400T30S)的通信调试过程。实验采用TTL串口转USB和专用转换器两种连接方式,重点测试了透传、定点传输和广播传输三种模式。在透传模式下,同一频率的模块会无差别接收数据;定点传输需指定目标地址(0-65535)和信道(0-83);广播传输则通过信道选择接收方。测试发现供电不足会影响通信稳定性,同时验证了网络ID和密钥对通信的影响:仅当网络ID和密钥均相同时才能建立通信。文档提供了详细的接线图、配置步骤和问题排查方法,为LoRa模块的初学者提供了实用参考。
2024-07-26 16:48:50
2042
1
原创 C++小知识02 —— void*
不知道指针类型?那就强转void*。这是C/C++程序员经常遇到的问题,那么void* 到底是什么意思呢,接下来我就和大家说一说他的详解和应用void在英文词典中译为“空虚、空间、空隙”,而它在C/C++中被翻译为“无类型”,相应的void*则为“无类型指针”void作用作用1:限定函数返回值的类型当函数不需要返回值的时候,我们可以用void类型,如下void fun(int a);作用2:限定函数参数当函数不需要参数的时候,我们可以在函数的参数列表中写上void,如下i
2022-05-11 16:56:59
1500
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人