- 博客(207)
- 收藏
- 关注
原创 C语言内存泄漏检测技术深度解析与嵌入式开发实践
注:Valgrind在资源受限设备(如RAM<64MB)可能引发性能瓶颈,建议在开发阶段使用模拟环境检测。优势:低开销(约5% RAM占用)、支持离线分析。C语言内存泄漏检测技术深度解析与嵌入式开发实践。一、内存泄漏的嵌入式威胁与检测原理。需编译器支持(GCC/Clang)(高级嵌入式软件开发工程师视角)内存泄漏检测在嵌入式系统中需兼顾。二、主流检测工具与嵌入式适配。仅支持Linux嵌入式环境。四、高频面试题与深度解析。三、嵌入式开发优化策略。五、总结与延伸方向。
2025-03-28 09:00:00
568
原创 C语言Canary值检测栈溢出机制与嵌入式开发实践
Canary作为"警戒线"隔离局部变量与关键控制数据(返回地址、基址指针),有效阻止溢出攻击路径。| Canary值 | ← 位于rbp-8(x86_64架构)自定义Canary验证失败处理(替代默认abort)C语言Canary值检测栈溢出机制与嵌入式开发实践。一、Canary机制的核心原理与实现。| 旧rbp |二、嵌入式开发中的特殊挑战与优化。| 函数参数 || 返回地址 || 局部变量 |禁用非常规格式符(%n/%s)
2025-03-26 09:00:00
817
原创 C语言指针运算深度解析与嵌入式开发实战
实际地址增加:2 * sizeof(int) = 8字节(32位系统)watch *(int*)0x20000000 # 监控内存写入。rwatch *ptr # 监控读取。C语言指针运算深度解析与嵌入式开发实战。(高级嵌入式软件开发工程师视角)二、嵌入式开发中的指针运算实战。三、高频面试题与深度解析。一、指针运算的核心机制。自定义分配逻辑 */四、调试与优化技巧。五、总结与延伸方向。
2025-03-25 09:00:00
1423
原创 C语言动态内存管理深度解析与嵌入式开发实战
/ 嵌入式系统需降级处理。C语言动态内存管理深度解析与嵌入式开发实战。二、嵌入式开发中的特殊约束与优化。(高级嵌入式软件开发工程师视角)一、动态内存函数原理与差异。三、常见动态内存错误与防御。四、高频面试题与深度解析。以下代码有何问题?
2025-03-24 22:52:22
806
原创 堆与栈的本质差异及嵌入式开发深度解析
堆:需开发者显式管理(`malloc`/`free`或`new`/`delete`),生命周期由代码逻辑决定。- 答案:管理方式(自动 vs 手动)、空间特性(固定 vs 动态)、性能(速度/碎片)、存储内容(函数上下文 vs 动态数据)。- 答案:静态分析(编译警告)、运行时检测(Canary值)、硬件特性(ARM的Stack Limit寄存器)。- 栈溢出:递归过深或局部数组过大导致,需通过静态分析工具(如`-Wstack-usage`)预判。- 答案:内存泄漏(未调用`free`)。
2025-03-21 09:00:00
1252
原创 动态内存分配
分配策略:首次适应(First-fit)/最佳适应(Best-fit)算法对碎片率影响显著。- 分级内存池:为不同尺寸对象创建独立内存池(如<64B, 64-256B, >256B)- 堆空间需手动管理,容量可达MB级但分配耗时不可预测(典型耗时:μs~ms级)- 工具链配置:GCC的`-Wl,--wrap=malloc`实现分配器行为监控。- `-fno-builtin-malloc`禁用内置分配器实现定制化管理。- 使用`CYCCNT`寄存器(Cortex-M系列)精确测量分配耗时。
2025-03-21 05:00:00
463
原创 嵌入式驱动开发方向的基础强化学习计划
指针与内存管理:动态内存分配、指针运算、内存泄漏检测(Valgrind工具)。- 进阶方向:完成基础阶段后,可进入驱动开发核心技能阶段(如Linux网络协议栈适配)。- 参与Zephyr OS开源项目,提交一个驱动模块代码(如温度传感器驱动)。- 项目复用:将SPI通信模块、LED驱动Demo作为简历项目案例,提升技术背书。- 通信协议:SPI/I2C协议时序分析、硬件调试工具(逻辑分析仪使用)。- 第4周:在树莓派上搭建Linux驱动开发环境,调试一个字符设备驱动模块。
2025-03-21 00:32:38
306
原创 运算符重载(operator overloading)
运算符重载(operator overloading) 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。 在C++中,可以定义一个处理类的新运算符。这种定义很像一个普通的函数定义,只是函数的名字由关键字 operator 及其紧跟的运算符组成,差别仅此而已。它像任何其他函数一样也是一个函数,当编译器遇到适当的模式时,就会调用这个函数。1. 加号运算符重载 如果想让自定义数据类型 进行+运算 需要重载 + 运算符 在成员...
2022-03-18 00:23:03
1899
原创 强化封装——数组类封装
强化封装——数组类封装MyArray.hclass MyArray {public: MyArray();//默认构造,默认100容量 MyArray(int capacity); MyArray(const MyArray& array);//拷贝 ~MyArray();//拷贝 void push_Back(int val);//尾插法 int getData(int index);//根据索引获取值 void setDat...
2022-03-13 17:35:28
300
原创 友元函数(friend)
全局函数 做 友元函数 类的主要特点之一是数据隐藏,即类的私有成员无法在类的外部(作用域之外)访问。但是,有时候需要在类的外部访问类的私有成员,怎么办? 解决方法是使用友元函数,友元函数是一种特权函数,C++允许这个特权函数访问私有成员,。 程序员可以把一个全局函数、某个类中的成员函数、甚至整个类声明为友元。 让全局的好基友函数 变为 我的好朋友 友元函数 友元函数 目的:访问类中的私有成员属性 全局函数做友元函数 ...
2022-03-10 22:46:00
3470
原创 常函数与常对象
常函数与常对象 常函数 void func() const {} 常函数 修饰是 this 指针 const Type* const this 常含数 不能修改 this 指针指向的值 常对象 在对象前 加入 const 修饰 const Person p1 常对象 不可以调用普通的成员函数 常对象 可以调用常含数 class Person {public: Person() { /* ...
2022-03-10 18:51:41
250
原创 空指针访问成员函数
空指针访问成员函数 若成员函数没有用到 this ,那么空指针可以直接访问 如果成员函数用到 this 指针,就要注意, 可以加if判断,如果 this 为空就 returnclass Person0007 {public: void show() { cout << "Person show." << endl; } void showAge() { if (this == NULL) { ...
2022-03-10 13:13:30
178
原创 this指针基本使用
C++面向对象模型初探this指针基本使用 C++的数据和操作也是分开存储,并且每一个非内联函数(non-inline member function)只会诞生一份函数实例,也就是说多个同类型的对象会公用一块代码。 一块代码是如何区分哪个对象调用自己的呢? C++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象。 C++规定,this是隐含在对象函数内的一种指针。当一个对象被创建后,它的每一个成员函数都含有一个系统自动生成的...
2022-03-10 13:00:39
672
原创 成员变量和成员函数分开处理
C++面向对象模型初探成员变量和成员属性分开处理C++实现了“封装”,那么数据(成员属性)和操作(成员函数)是什么样呢?“数据”和“处理数据的操作(函数)”是分开存储的。 1. C++中的非静态数据成员直接内涵在类对象中,就像 C struct一样。 2. 成员函数(member function)虽然内涵在class声明之内,却不出现在对象中。 3. 每一个非内联成员函数(non-inline member function)只会诞生一份函数实例。空类的大小为 1...
2022-03-10 11:06:20
147
原创 静态成员变量 和 静态成员函数
静态成员变量 和 静态成员函数静态成员变量 编译阶段分配内存 所有对象共享数据 通过对象访问、通过类名访问 有权限控制 类内声明、类外初始化 在一个类中,若将一个成员变量声明为static,这种成员称为静态成员变量。与一般的数据成员不同,无论建立多少个对象,都只有一个静态数据的拷贝,静态成员变量,属于某个类,所有对象共享。 静态变量,是在编译阶段分配空间,对象还没有创建时,就已经分配空间。 静态成员变量必须在类中声明,在类外定义。...
2022-03-06 23:29:32
388
原创 动态对象创建
动态对象创建C语言中malloc和free的问题: 1. 程序员必须确定对象的长度; 2. malloc 返回一个 void*指针,C++不允许将 void*赋值给其他任何指针, 故必须强转; 3. malloc 可能申请内存失败, 所以必须判断返回值来确保内存分配成功; 4. 用户在使用对象之前必须记住对他初始化, 构造函数不能显示调用初始化(构造函数是由编译器调用), 用户有可能忘记调用初始化函数。new operator new 会返回一个该...
2022-03-06 20:11:44
705
原创 explicit关键字作用
explicit关键字作用 作用:防止构造函数中的隐式类型转换class MyString {public: MyString(const char* str) { } explicit MyString(int a) { mSize = a; } char* mStr; int mSize;};void test006() { MyString str = "abc"; //隐式类型转换 MyStr...
2022-03-06 18:18:48
108
原创 类对象作为类成员的案例
类对象作为类成员的案例 类对象作为类成员, 构造顺序先将类对象一一构造,然后构造自己; 析构顺序与构造的顺序相反,先析构自己,再析构对象。class Phone {public: Phone() { cout << "Phone's default constructor." << endl; } Phone(string name) { m_PhoneName = name; cout << "Phone's par...
2022-03-06 17:55:53
164
原创 初始化列表
初始化列表 初始化列表语法在构造函数后面 + :属性(值、参数),属性(值、参数)class Person005 {public: /*Person005() { }*/ //有参初始化数据 /*Person005(int a, int b, int c) { m_A = a; m_B = b; m_C = c; }*/ Person005() :m_A(10), m_B(20), m...
2022-03-06 17:15:31
181
原创 深拷贝与浅拷贝
深拷贝与浅拷贝“Person05::Person05(char *,int)”: 无法将参数 1 从“const char [5]”转换为“char *” Project1 解决方法:右键项目 -> 属性 -> C/C++ -> 语言 -> 符合模式改成“否”浅拷贝:系统默认提供的拷贝构造,做简单的值拷贝; 如果属性里有指向堆空间的数据,那么简单的浅拷贝会导致重复释放内存的异常。 解决该问题,需要自己提供拷贝构造函数,进行深拷贝。 深拷...
2022-03-06 16:59:45
416
原创 对象的构造和析构
对象的构造和析构1. 对象的初始化和清理 构造函数 和 析构函数 被编译器自动调用完成对象初始化和对象清理工作。2. 构造函数 和 析构函数 构造函数写法与类名相同,没有返回值,不写void(可以有参数) 可以发生重载构造函数由编译器自动调用,而不是手动,且只调用一次。 析构函数写法与~类名相同 类名前面加一个符号“~” 也没有返回值,不写void 不可以有参数(不能)自动调用 只会调用一次 如果没有提供构造和析构,系统会默认提供...
2022-03-06 15:31:36
703
原创 面向对象设计案例
面向对象设计案例1. 设计立方体类 求立方体面积和体积,分别用全局函数和成员函数判断两个立方体是否相等。 class Cube {public: void setL(int l) { m_L = l; } int getL() { return m_L; } int cGetL() const{ return m_L; } void setW(int w) { ...
2022-03-04 18:16:19
1232
1
原创 封装(C++)
C语言下的封装 和 C++的封装 区别C语言封装 属性和行为分开处理 类型检测不够struct Person { char mName[64]; int mAge;};void PersonEat(struct Person* p) { printf("%s 在吃饭。\n",p->mName);}struct Dog { char mName[64]; int mAge;};void DogEat(struct D...
2022-03-02 12:33:17
453
原创 extern C浅析
extern C浅析 1个无法解析的外部命令:意思是链接时链接不到外部函数或方法 在C++中函数可以发生重载,编译器会把函数名称统统改变 C++中想调用C语言方法:1.extern "C" void show();//show()方法按C语言方式做连接 2.#ifdef __cplusplus//两个下划线_extern "C"{ extern "C"#endif//!__cplusplus#include <stdio...
2022-03-01 23:10:27
559
原创 函数重载(overload)
函数重载(overload)1. 函数重载的语法 C++中 函数名称可以重复 必须在同一个作用域 函数的参数 个数、类型或顺序 不同//overloadvoid func() { cout << "func()" << endl;}void func(int a) { cout << "func(int a)" << endl;}void func(double a) { cout ...
2022-03-01 22:47:29
966
原创 函数的默认参数及占位参数
函数的默认参数及占位参数函数的默认参数参数后面=... 参数可以有默认值void func(int a = 10, int b = 10) { cout << "a+b=" << a + b << endl;}void test21() { func();}函数参数注意事项: 如果有一个位置有了默认参数,那么从这个位置开始,从左往右都必须有默认参数。 传入参数,如果有参数用传入参数,没有...
2022-03-01 21:42:38
486
原创 内联函数——解决宏缺陷问题
内联函数 目的:代替宏函数的 内联函数的引出——宏函数的缺陷 宏函数的缺陷case 1://定义一个加法#define MyAdd(x,y) ((x)+(y))void test18() { int ret = MyAdd(10, 20) * 20;//预期600,实际是410,加括号可以处理 cout << ret << endl;}case 2:#define MyCompare(a,b) ((a)...
2022-03-01 21:20:01
192
原创 两个类的简单案例
1.设计圆类//1.设计一个类,求圆的周长const double pi = 3.14;//周长公式: 2*pi*rclass Circle {//class代表一个类 后面是类名public://公共权限 double calculate() {//成员函数 return 2 * pi * m_R; } //成员函数可以修改 成员属性 void setR(int r) {//半径的成员方法 m_R = r; }...
2022-03-01 20:31:32
181
原创 引用的入门
引用 引用是C++对C的重要扩充。引用的实质:起别名。 int &b=a; &写到左侧:引用;&写道右侧:取地址。1.引用基本语法Type &别名 = 原名 void test05() { int a = 10; int& b = a; b = 20; cout << "a=" << a << ",b=" << b << en...
2022-02-28 22:22:50
286
原创 const
const的作用: 1.定义常量,具有不可变性; 2.便于进行类型检查,使编译器对处理内容有更多的了解,消除了一些隐患。 3.避免意义模糊的数字出现,便于进行参数的调整修改。 4.可以保护被修饰的东西,防止意外修改,增强程序的健壮性。 5.可以节省空间,避免不必要的内存分配。 6.提高效率,存在符号表中,没有储存和读内存的操作。C语言中const默认外部链接,C++默认内部链接C语言:test.c const int a = 10...
2022-02-28 12:45:10
94
原创 C++对C语言的增强
C++对C语言的增强1.全局变量检测增强2.函数检测增强,参数类型增强,返回值检测增强,函数调用参数检测增强3.类型转换检测增强4.struct增强 C语言使用必须加入struct关键字,C++可以不加 struct Person{ int m_Age; void plusAge(){ m_Age++; }}void test04(){ Person p1; p1.m_Age=10; p1.plusAge(); cout&l...
2022-02-28 08:41:18
156
原创 指针的大小
指针的大小1.指针所占空间与指针指向的内容和内容的大小无关2.不同操作系统及编译环境下指针类型所占用的字节数是不同的指针类型占用的内存大小是固定的(无论该指针指向哪种数据类型)编译生成16位的代码时指针占2个字节在32位系统中是4字节在64位系统中是8字节。...
2022-02-26 12:20:28
1548
原创 堆和栈的区别
1.存储内容不同 栈:函数调用时,栈中存放函数中的各个参数(局部变量)。栈底下是函数调用后的下一条指令。 堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容由程序员安排。2.管理方式不同 栈:由系统自动分配空间,同时系统自动释放空间。 堆:需要程序员手动申请并且手动释放,并指明大小。3.空间大小不同 栈:获取空间较小。 堆:获取空间与系统的虚拟内存有关,较灵活较大。4.能否产生碎片 栈:不会产生碎片,空间连续。 堆:采用链表的存储...
2022-02-26 10:04:20
209
原创 堆排序入门
堆排序堆的定义 小根堆:ai<=a2i、ai<=a(2i+1) 大根堆:ai>=a2i、ai>=a(2i+1) 从堆的定义可以看出,堆实质是满足如下性质的完全二叉树;二叉树中任一非叶子结点均小于(大于)它的孩子结点 堆排序 若在输出堆顶的最小值(最大值)后,使得剩余n-1个元素的序列重又建成一个堆,则得到n个元素的次小值(次大值)......如此反复,便能得到一个有序序列,这个过程称之为堆排序。 实现堆排...
2022-02-26 09:44:44
743
原创 命名空间namespace
主要用途:用来解决命名冲突的问题。1.命名空间下 可以放 函数、变量、结构体、类2.命名空间必须定义在 全局作用域 下3.命名空间可以嵌套命名空间4.命名空间是开放的,可以随时往原先的 命名空间 添加内容5.匿名(无名)命名空间 相当于写了 static int m_C;static int m_D; 只能在当前文件夹使用6.命名空间可以起别名game1.h#pragma once#include<iostream>using namesp...
2022-02-24 19:46:30
182
原创 C++中双冒号(::)作用域运算符
使用后调用全局变量,例子如下:#define _CRT_SECURE_NO_WARNINGS#include <iostream>using namespace std;int atk = 200;void test() { int atk = 100; cout << "局部攻击力:" << atk << endl; //双冒号::为作用域运算符,引用全局作用域 cout << "全局攻击力:" << ::at
2022-02-24 17:58:52
223
原创 NC127 最长公共子串
描述给定两个字符串str1和str2,输出两个字符串的最长公共子串题目保证str1和str2的最长公共子串存在且唯一。数据范围:1 \le |str1|,|str2| \le 50001≤∣str1∣,∣str2∣≤5000要求: 空间复杂度O(n^2)O(n2),时间复杂度O(n^2)O(n2)示例1输入:"1AB2345CD","12345EF"返回值:"2345"备注:1 \leq |str_1|, |str_2| \leq 5\,000...
2022-02-21 20:49:03
157
原创 位运算(C)
位运算1.按位运算 按位运算C有这些按位运算的运算符& 按位的与| 按位的或~ 按位取反^ 按位的异或<< 左移>> 右移 按位与&(两个都是1才是1)如果 x=1 并且 y=1, 那么x&y=1否则的话 (x&y)=0按位与常应用于两种应用: 让某一位或某些位为0: x & 0xFE FE最后一位为0,所以使得另一个数最后一位为0 取一个数中的一段: x &am...
2022-02-12 13:15:57
445
原创 文件及二进制文件
文件1.格式化输入输出 格式化的输入输出printf %[flags][width][.prec][hlL]typescanf %[flag]type %[flags][width][.prec][hlL]type Flag: -、+、(space)、0含义:左对齐、在前面放+或-、正数留空、0填充width或prec:number、*、.number、.*含义:最小字符数、下一个参数是字符数、小数点后的位数、下一个参数是小数点后的...
2022-02-12 11:05:30
804
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人