- 博客(17)
- 收藏
- 关注
原创 嵌入式软件工程师面经C/C++篇—C++ 常量指针、指针常量、常量引用:一篇搞懂
本文深入解析了C++中const与指针、引用的组合用法。核心要点包括:1)常量指针(const int* p)- 指向内容不可改但指针可变;2)指针常量(int* const p)- 指针地址固定但内容可改;3)常量引用(const int& r)- 引用内容不可改且可绑定字面值。文章强调const修饰对象取决于其位置,并指出不存在"引用常量"概念,因为引用本质就是不可改指向的。通过代码示例和记忆技巧,帮助读者区分这些易混淆概念,并介绍了实际应用场景。
2025-10-13 12:59:09
801
原创 嵌入式软件工程师面经C/C++篇—数组的内存存储:一文看懂数组存在哪里、怎么存
本文介绍了C/C++中数组的存储位置和方式。数组存储位置取决于定义方式:局部固定数组在栈中,全局/静态数组在全局区,动态数组(malloc/new分配)在堆中,类成员数组随对象存储。数组元素始终连续存储,从低地址到高地址排列,多维数组按行优先存储。文中还指出了常见错误,如数组越界、动态数组未释放等,并给出了正确实践建议。文章通过代码示例详细展示了不同数组的存储特点,帮助读者理解这一基础知识点。
2025-10-13 12:48:54
1092
原创 嵌入式软件工程师面经C/C++篇—重写 memcpy () 函数:从原理到注意事项(超详细入门)
本文详细讲解了如何手动实现C语言的memcpy()函数,重点分析了内存重叠处理、空指针检查、类型转换等5个关键问题,并提供了完整代码示例。通过对比标准memcpy()和memmove()的区别,帮助读者深入理解内存复制的底层原理。文章还总结了实现memcpy()的5个核心步骤,并解答了常见面试问题,是一份实用的memcpy()实现指南。
2025-10-09 22:04:16
1032
原创 嵌入式软件工程师面经C/C++篇—函数调用约定:一文看懂 __cdecl 和 __stdcall(超详细入门)
本文详细解析C/C++中的两种函数调用约定:__cdecl和__stdcall。__cdecl是C语言默认约定,参数从右到左压栈,调用者负责清理栈,支持可变参数函数;__stdcall常用于Windows API,同样从右到左压栈,但由被调用者清理栈,效率更高但不支持可变参数。文章通过代码示例和汇编解析直观展示两种约定的区别,并指出在实际开发中调用约定不匹配可能导致链接错误或程序崩溃,强调确保函数声明与实际约定一致的重要性。理解这些规则对调用系统API和第三方库至关重要。
2025-10-09 21:59:19
962
原创 嵌入式软件工程师面经C/C++篇—volatile 关键字:从原理到实战(超易懂讲解)
volatile是C/C++中防止编译器错误优化的关键字,强制每次访问变量都从内存读取最新值。它主要用于三种场景:1)中断服务程序修改的变量;2)多线程共享的标志变量;3)硬件寄存器映射。虽然volatile能保证内存可见性和指令有序性,但不能保证原子性,不能替代锁机制。开发中当变量可能被编译器未知方式(硬件、中断、多线程)修改时,必须使用volatile来避免优化错误。关键区别在于:volatile阻止编译器优化,而锁/原子类型解决并发冲突。
2025-10-05 12:18:14
829
原创 嵌入式软件工程师面经C/C++篇—const 和 #define 的区别
本文对比了C++中宏定义(#define)和常量(const)的核心区别:1)宏在预处理阶段进行文本替换,无类型检查;常量在编译阶段处理,有类型安全检查。2)宏不分配内存,每次使用产生副本;常量分配一次内存。3)宏无法调试,常量可以调试。4)宏作用域到文件结尾,常量遵循标准作用域规则。建议优先使用const定义常量,仅保留#define用于条件编译等特殊场景。const具有类型安全、调试友好和内存高效的优点,是现代C++的首选方式。
2025-10-05 12:08:36
1060
原创 嵌入式软件工程师面经C/C++篇—const 关键字全解析:从基础用法到进阶实战
本文介绍了编程语言中const关键字的用法及作用。在C语言中,const主要用于定义常量和保护函数参数不被修改。C++在继承C用法的基础上,扩展了const在面向对象编程中的应用,包括const指针(指向常量的指针、常量指针、指向常量的常量指针)、const引用、const成员函数和const成员变量。核心原则是"const离谁近,谁就不能被修改"。const能提高代码安全性、清晰度和编译器优化空间,特别在C++中,const成员函数是保证常量对象正常工作的关键。
2025-09-30 21:02:41
1018
原创 嵌入式软件工程师面经C/C++篇—static 关键字:用法、原理与实例详解
摘要:本文系统讲解C/C++中static关键字的用法,涵盖C语言的3种基础用法(局部变量、全局变量、函数)和C++的类成员扩展用法。重点解析static如何改变变量/函数的生命周期(移至静态数据区)和链接属性(限制作用域),并通过实例对比普通变量与静态变量的区别。C++部分强调静态成员变量(类级共享)和静态成员函数(无this指针)的特性,提供对象计数等典型应用场景。最后总结用法总表和常见面试题,帮助开发者全面掌握这一核心概念。全文逻辑清晰,实例丰富,适合需要深入理解static的读者。
2025-09-30 20:56:23
1058
原创 嵌入式软件工程师面经C/C++篇—char 与 int 的转换:原理、方法与避坑指南
本文深入解析C/C++中char与int类型转换的底层原理和常见场景。核心差异在于字节长度和取值范围,char分signed/unsigned类型,转换本质是1字节与4字节整数的相互操作。char转int需注意符号扩展(signed)或零扩展(unsigned),int转char则存在截断风险。文章通过实例演示了ASCII码转换、数值截断等典型场景,并对比了atoi与strtol函数的字符串转换用法。最后总结了三个常见陷阱:符号扩展错误、数值范围溢出和atoi转换失败处理,强调类型区分和范围检查的重要性。掌
2025-09-29 22:26:23
1727
原创 嵌入式软件工程师面经C/C++篇—彻底厘清:C++ 中 struct 与 class 的核心区别
C++中struct和class的核心区别在于:1)默认访问权限(struct为public,class为private);2)默认继承方式(struct为public,class为private);3)struct不支持模板参数定义;4)struct默认支持聚合初始化。语义上,struct适合轻量数据容器,class适合面向对象建模。尽管功能相似,但struct保留主要是为了兼容C语言,两者在性能上没有差异。遵循"struct开放数据、class封装对象"的约定能写出更规范的代码。
2025-09-29 22:19:09
965
原创 嵌入式软件工程师面经C/C++篇—extern 关键字最易忽略的陷阱与避坑指南
C/C++中extern关键字的常见陷阱包括:1)头文件中直接定义全局变量导致重复定义;2)extern声明与头文件包含缺失引发维护问题;3)函数声明与原型不一致导致运行时错误;4)函数内部extern意外扩大作用域;5)extern与static冲突;6)extern声明中错误初始化。最佳实践:头文件仅声明,定义放.c文件;统一管理声明;严格匹配函数原型;慎用函数内extern;避免static与extern混用。这些规则可显著提升代码健壮性。
2025-09-28 20:30:45
850
原创 嵌入式软件工程师面经C/C++篇—extern “C“ 详解:从原理到实战
摘要: extern "C"是C++中解决C/C++混合编程兼容性的关键工具,核心作用是强制C++编译器按C语言规则处理函数/变量的编译链接(禁用名称修饰)。其使用场景包括:1)C++调用C库时包裹头文件;2)C调用C++函数时修饰导出函数;3)兼容C/C++的头文件编写。需注意避免修饰类成员函数、与static混用或重载函数。通过__cplusplus宏可智能区分编译器,确保符号兼容性,避免链接错误。理解其原理能有效解决跨语言调用的符号匹配问题。
2025-09-28 11:17:27
1181
原创 嵌入式软件工程师面经C/C++篇—C 语言内存分配与检索:从基础到实践
C语言内存管理详解:文章介绍了C程序运行时的5个关键内存区域(代码段、文字常量区、全局/静态区、栈区和堆区),重点分析了三种内存分配方式:1)静态内存分配(全局/静态区)用于共享数据和保留历史值;2)栈内存分配(栈区)用于函数内部临时变量,效率高但容量有限;3)堆内存分配(堆区)需手动管理,适合动态大小数据。文章还详细讲解了内存检索方法、常见内存问题(泄漏、悬空指针、越界)及其解决方案,强调严格检查索引范围和"配对释放"原则。掌握这些规则可有效避免90%的内存问题,编写更稳定的C程序。
2025-09-28 10:40:19
876
原创 嵌入式软件工程师面经C/C++篇—指针与引用:从本质到应用
本文通过“房子”比喻形象地区分指针和引用的核心概念:指针是存储地址的变量(如地址纸条),引用是变量的别名(如房子昵称)。从7个维度详细对比:指针有独立内存、可空可变,需解引用;引用无独立内存、必须初始化且不可变,自动解引用。代码示例展示了二者在访问修改、指向变更、sizeof等方面的差异,并说明指针和引用相互转换的条件。最后给出使用建议:优先用引用传递参数和返回值,动态内存、空值或需改变指向时用指针。附总结表格和常见面试题解析。
2025-09-27 19:01:32
1034
原创 嵌入式软件工程师面经C/C++篇—从 “1G 内存能否 malloc (1.2G)” 看透内存管理核心原理
本文解答了开发者常见的疑问:1G物理内存能否成功申请1.2G内存。通过代码验证说明,在32位系统中malloc(1.2G)确实可能成功,因为malloc申请的是虚拟内存而非物理内存。文章深入解析了虚拟内存机制、地址转换流程、malloc最大申请量限制、内存管理策略等核心概念,并指出常见误区如物理内存立即分配、free立即释放等错误认知。最后提供了正确内存使用示例,帮助开发者理解底层原理,避免内存相关错误。
2025-09-27 17:13:57
991
原创 嵌入式软件工程师面经C/C++篇—Linux 下 malloc 底层原理与内存管理全解析
本文深入解析了C/C++中malloc的底层实现机制,重点介绍了Linux环境下动态内存管理的工作原理。文章首先阐述了Linux进程虚拟内存布局,包括代码段、堆、栈等区域的功能特点。然后详细分析了malloc的两种核心分配方式:brk()用于小内存分配,通过调整堆边界指针实现;mmap()用于大内存分配,在映射区开辟独立空间。文章还探讨了内存池优化机制、相关函数(calloc/realloc/free)的区别,以及常见的内存错误和规避方法。最后通过简化实现展示了malloc如何通过空闲链表管理内存块。这些知
2025-09-27 14:24:20
1337
原创 嵌入式软件工程师面经C/C++篇—new/delete vs malloc/free 对比
摘要:本文深入对比了C++中new/delete与malloc/free两套内存管理机制的核心差异。new/delete作为C++运算符,能自动处理对象构造/析构,支持类型安全和运算符重载;而malloc/free作为C库函数仅进行内存块操作。通过代码示例展示了二者在语法、初始化、异常处理等方面的区别,并强调禁止混用。建议C++开发优先使用new/delete配合智能指针,仅在特定场景使用malloc/free。理解这些差异是编写安全高效C++代码的基础。
2025-09-27 10:59:51
716
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅