【C语言】内存管理
【C语言】内存管理
文章目录
- 【C语言】内存管理
- 1.概念
- 2.库函数
- 3.动态分配内存
- malloc
- calloc
- 4.重新调整内存的大小和释放内存
- realloc
- free
1.概念
C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。
在 C 语言中,内存是通过指针变量来管理的。指针是一个变量,它存储了一个内存地址,这个内存地址可以指向任何数据类型的变量,包括整数、浮点数、字符和数组等。C 语言提供了一些函数和运算符,使得程序员可以对内存进行操作,包括分配、释放、移动和复制等。
2.库函数
序号 | 函数及描述 |
---|---|
1 | void *calloc(int num, int size); 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为0。所以它的结果是分配了 num * size 个字节长度的内存空间,并且每个字节的值都是0。 |
2 | void free(void *address); 该函数释放 address 所指向的内存块,释放的是动态分配的内存空间。 |
3 | void *malloc(int num); 在堆区分配一块指定大小的内存空间,用来存放数据。这块内存空间在函数执行完成后不会被初始化,它们的值是未知的。 |
4 | void *realloc(void *address, int newsize); 该函数重新分配内存,把内存扩展到 newsize 。 |
**注意:**void * 类型表示未确定类型的指针。C、C++ 规定 void * 类型可以通过类型转换强制转换为任何其它类型的指针。
3.动态分配内存
编程时,如果预先知道数组的大小,那么定义数组时就比较容易。例如,一个存储人名的数组,它最多容纳 100 个字符,所以您可以定义数组,如下所示:
char name[100];
但是,如果预先不知道需要存储的文本长度,例如想存储有关一个主题的详细描述。在这里,我们需要定义一个指针,该指针指向未定义所需内存大小的字符,后续再根据需求来分配内存,如下所示:
malloc
void *malloc(size_t size);size 参数指定了需要分配的内存大小,单位是字节(byte)。size_t 是一个无符号整数类型,通常用来表示大小和计数。功能描述:
malloc 函数在程序的堆区(heap)请求一块至少为 size 字节的内存区域。如果内存分配成功,malloc 返回一个指向这块内存的指针,程序员可以使用这个指针来访问和操作分配的内存。
如果分配失败,通常是因为堆上没有足够的内存空间,malloc 会返回 NULL。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{char name[100];char *p;strcpy(name, "xiao ming");/* 动态分配内存 */p = (char *)malloc( 10 * sizeof(char) );// 分配一个整数数组的空间,大小为10个charif( p == NULL ){perror("malloc");}else{strcpy( p, "xiao ming is a student ");}printf("Name = %s\n", name );printf("p: %s\n", p );free(p);
}
注意事项:
- 初始化:
malloc
分配的内存空间不会被自动初始化,它的初始内容是未定义的。如果需要初始化,必须手动设置。 - 内存泄漏:使用
malloc
分配的内存必须在不再需要时使用free
函数释放。如果忘记释放,将导致内存泄漏。 - 大小计算:分配数组时,需要使用
sizeof
来确保分配的内存大小正确。例如,分配一个包含n
个元素的数组时,应使用n * sizeof(element)
作为malloc
的参数。 - 错误处理:如果
malloc
返回NULL
,应该妥善处理这种情况,可能是程序应该终止或采取其他恢复措施。 - 指针类型:
malloc
返回的是void*
类型的指针,这是C语言中所有指针类型的通用类型。在使用malloc
分配特定类型的内存时,通常需要强制类型转换,如int* array = malloc(10 * sizeof(int));
。
malloc
是动态内存分配的核心函数之一,在需要处理不确定数量的数据或实现某些数据结构(如链表、树等)时非常有用。正确使用 malloc
和 free
对于编写稳健和高效的C程序至关重要。
calloc
calloc
是 C 语言中用于动态内存分配的另一个标准库函数,它在很多方面与 malloc
相似,但有一个关键的区别在于初始化行为。下面是 calloc
函数的详细介绍:
函数原型:
void *calloc(size_t num, size_t size);
num
参数指定了要分配的元素数量。size
参数指定了每个元素的大小,单位是字节。
功能描述:
calloc
函数在程序的堆区分配一块总大小为num * size
字节的内存区域,并且将这块内存区域的每个字节都初始化为0。这使得calloc
成为分配和初始化静态数组或数据结构(如矩阵)的理想选择。- 如果内存分配成功,
calloc
返回一个指向这块内存的指针;如果失败,返回NULL
。
使用示例:
#include <stdlib.h> // 包含calloc函数的头文件int main() {int rows = 5;int columns = 5;// 分配一个5x5的整数矩阵,并初始化为0int *matrix = calloc(rows * columns, sizeof(int));if (matrix == NULL) {// 处理内存分配失败的情况fprintf(stderr, "Memory allocation failed.\n");return 1;}// 使用分配的内存// 注意:矩阵已经初始化为0free(matrix); // 释放分配的内存return 0;
}
注意事项:
- 初始化:与
malloc
不同,calloc
分配的内存区域会自动初始化为0,这对于需要清零的数据结构非常有用。 - 内存泄漏:和
malloc
一样,使用calloc
分配的内存也必须在使用完毕后用free
函数释放,以避免内存泄漏。 - 大小计算:分配数组或复合数据结构时,应使用
sizeof
来确保分配的内存大小正确。 - 错误处理:如果
calloc
返回NULL
,应该妥善处理这种情况,可能是程序应该进行错误恢复或终止。 - 指针类型:
calloc
返回的是void*
类型的指针,在使用时通常需要强制类型转换到具体的数据类型指针。
calloc
是动态内存分配中一个非常有用的函数,特别是当你需要分配一块内存并确保它是清零的状态时。正确地使用 calloc
可以帮助你更容易地初始化复杂的数据结构,并保持代码的清晰和简洁。
4.重新调整内存的大小和释放内存
当程序退出时,操作系统会自动释放所有分配给程序的内存,但是,建议在不需要内存时,都应该调用函数 free() 来释放内存。
或者,可以通过调用函数 realloc() 来增加或减少已分配的内存块的大小。让我们使用 realloc() 和 free() 函数。
realloc
realloc
是 C 语言中的一个用于内存管理的函数,它允许你更改先前使用 malloc
或 calloc
函数分配的内存块的大小。这个函数非常有用,当你需要调整一个数据结构的大小以适应程序运行时变化的需求时。
函数原型:
void *realloc(void *ptr, size_t new_size);
ptr
是指向先前分配的内存块的指针。new_size
是新的内存大小,单位是字节。
功能描述:
realloc
尝试将指针ptr
指向的内存块调整为new_size
字节大小。- 如果
ptr
是NULL
,realloc
表现得就像malloc(new_size)
,分配一个新的内存块。 - 如果
new_size
是 0,realloc
表现得就像free(ptr)
,释放内存块。 - 如果
realloc
成功,它返回指向重新分配(可能移动)内存块的指针。如果内存块被移动,原内存块的内容会被复制到新位置。 - 如果
realloc
失败,它返回NULL
,原始内存块保持不变。
使用示例:
#include <stdlib.h> // 包含realloc函数的头文件int main() {int *array = malloc(5 * sizeof(int)); // 初始分配if (array == NULL) {fprintf(stderr, "Initial memory allocation failed.\n");return 1;}// 假设需要扩大数组array = realloc(array, 10 * sizeof(int)); // 重新分配更大的空间if (array == NULL) {fprintf(stderr, "Memory reallocation failed.\n");free(array); // 确保释放原始内存return 1;}// 使用扩大后的数组// ...free(array); // 释放分配的内存return 0;
}
注意事项:
- 内存块可能移动:
realloc
可能会将内存块移动到堆中的另一个位置,因此返回的新指针可能与原始指针不同。这意味着你应该总是使用realloc
返回的指针来引用内存。 - 内容复制:如果内存块被移动,
realloc
会自动将原始内存块的内容复制到新位置。 - 内存泄漏风险:如果
realloc
失败,原始内存块仍然有效,不会自动释放。因此,你应该在重新分配内存之前保存原始指针的副本,并在必要时释放它。 - 错误处理:如果
realloc
返回NULL
,应该检查new_size
是否为预期值,并处理可能的错误情况。 - 性能考虑:频繁地使用
realloc
可能会导致性能问题,特别是如果内存块经常需要移动到新位置时。
realloc
是一个强大的工具,可以帮助你管理程序运行时的内存需求。然而,由于它可能会改变内存块的位置,使用时需要小心,确保正确地处理返回的新指针。
free
free
函数是 C 语言中用于释放之前使用 malloc
、calloc
或 realloc
函数分配的动态内存的标准库函数。正确地使用 free
函数对于防止内存泄漏和有效管理程序的内存使用至关重要。
函数原型:
void free(void *ptr);
ptr
是指向要释放的内存块的指针。如果ptr
是NULL
,调用free
没有效果,但这种调用是安全的,不会引发错误。
功能描述:
free
函数的作用是将之前动态分配的内存块返回给操作系统或运行时环境,使其可以被其他部分的程序再次使用。- 当没有更多的内存可用于新的内存分配请求时,释放不再需要的内存块是一种良好的编程实践。
注意事项:
- 释放NULL指针:根据 C 标准,尝试释放一个
NULL
指针是安全的,free
将不做任何操作。 - 悬挂指针:释放内存后,指针指向的内存已经不再属于你的程序,因此不应再使用该指针(称为悬挂指针)。
- 内存泄漏:如果忘记了调用
free
来释放动态分配的内存,将导致内存泄漏,长期运行的程序可能会因此耗尽可用内存。 - 重复释放:不应尝试多次释放同一块内存,这可能会导致未定义的行为或程序崩溃。
使用 free
函数是 C 语言编程中的一个重要方面,它确保了程序的健壮性和资源的有效使用。记住,每次使用 malloc
、calloc
或 realloc
分配内存时,都应该在适当的时候使用 free
来释放内存。
相关文章:
【C语言】内存管理
【C语言】内存管理 文章目录 【C语言】内存管理1.概念2.库函数3.动态分配内存malloccalloc 4.重新调整内存的大小和释放内存reallocfree 1.概念 C 语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 在 C 语言中,内存是通过…...
团体程序设计天梯赛-练习集——L1-029 是不是太胖了
前言 5分级别里面目前做到的最难的一道题,但是非常简单,5分的题看看写点代码就行了。 L1-029 是不是太胖了 据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。已知市斤的数值是公斤数…...
appmatrix平台(一个汇集原创web APP的平台)服务规划
Appmatrix平台(一个汇集原创web APP的平台)服务规划 Web app是部署机器学习、深度学习等需要算力较大的应用的主要形式,一般都是独立、散在部署,对使用和相互交流造成了一定的不便。App Matrix将各类web应用汇集在一起࿰…...
vscode+WSL2(ubuntu22.04)+pytorch+conda+cuda+cudnn安装系列
最近在家过年闲的没事,于是研究起深度学习开发工具链的配置和安装,之前欲与天公试比高,尝试在win上用vscodecuda11.6vs2019的cl编译器搭建cuda c编程环境,最后惨败,沦为笑柄,痛定思痛,这次直接和…...
pytorch实现长短期记忆网络 (LSTM)
人工智能例子汇总:AI常见的算法和例子-CSDN博客 LSTM 通过 记忆单元(cell) 和 三个门控机制(遗忘门、输入门、输出门)来控制信息流: 记忆单元(Cell State) 负责存储长期信息&…...
洛谷P2651 添加括号III
题目链接:P2651 添加括号III - 洛谷 | 计算机科学教育新生态 题目难度:普及一 题目分析: a1肯定是分子,a2肯定是分母,那么尽可能多的是a3以后的变为分子,怎么办呢? a1/(a2/a3/a4/...)a1a3a4.../a2&#…...
Mysql进阶学习
目录 一.Mysql服务器内部架构(了解) 二.Mysql引擎 2.1 innodb引擎 2.2 myisam引擎 三.索引 3.1索引分类 3.2mysql索引数据结构 3.3聚簇索引和非聚簇索引 3.4回表查询 3.5索引下推 四.事务 数据库事务特征 事务隔离性,隔离级别 事务实现原理 五.锁 ①…...
白话DeepSeek-R1论文(二)| DeepSeek-R1:AI “升级打怪”,从“自学成才”到“全面发展”!
最近有不少朋友来询问Deepseek的核心技术,今天开始陆续针对DeepSeek-R1论文中的核心内容进行解读,并且用大家都能听懂的方式来解读。这是第二篇趣味解读。 DeepSeek-R1:AI “升级打怪”,从“自学成才”到“全面发展”!…...
WordPress eventon-lite插件存在未授权信息泄露漏洞(CVE-2024-0235)
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...
python 语音识别
目录 一、语音识别 二、代码实践 2.1 使用vosk三方库 2.2 使用SpeechRecognition 2.3 使用Whisper 一、语音识别 今天识别了别人做的这个app,觉得虽然是个日记app 但是用来学英语也挺好的,能进行语音识别,然后矫正语法,自己说的时候 ,实在不知道怎么说可以先乱说,然…...
2501,编写dll
DLL的优点 简单的说,dll有以下几个优点: 1)节省内存.同一个软件模块,若是源码重用,则会在不同可执行程序中编译,同时运行这些exe时,会在内存中重复加载这些模块的二进制码. 如果使用dll,则只在内存中加载一次,所有使用该dll的进程会共享此块内存(当然,每个进程会复制一份的d…...
Linux命令汇总
1、帮忙类 --help 直接在当前窗口显示帮助 command --help man 创建新窗口显示帮助 man command 2、目录操作类 2.1、查看目录 ls:以列表方式,查看目录中内容 tree:以树状方式,查看目录中内容 2.2、创建、删除文件及目录 touch:创建…...
漏洞扫描工具之xray
下载地址:https://github.com/chaitin/xray/releases 1.9.11 使用文档:https://docs.xray.cool/tools/xray/Scanning 与burpsuite联动: https://xz.aliyun.com/news/7563 参考:https://blog.csdn.net/lza20001103/article/details…...
Java手写简单Merkle树
Java手写Merkle树代码 package com.blockchain.qgy.component;import com.blockchain.qgy.model.MerkleTreeNode; import com.blockchain.qgy.util.SHAUtil;import java.util.*;public class MerkleTree<T> {//merkle树private List<MerkleTreeNode<T>> lis…...
vue之pinia组件的使用
1、搭建pinia环境 cnpm i pinia #安装pinia的组件 cnpm i nanoid #唯一id,相当于uuid cnpm install axios #网络请求组件 2、存储读取数据 存储数据 >> Count.ts文件import {defineStore} from piniaexport const useCountStore defineStore(count,{// a…...
升级到Mac15.1后pod install报错
升级Mac后,Flutter项目里的ios项目运行 pod install报错, 遇到这种问题,不要着急去百度,大概看一下报错信息,每个人遇到的问题都不一样。 别人的解决方法并不一定适合你; 下面是报错信息: #…...
力扣【1049. 最后一块石头的重量 II】Java题解(背包问题)
让石头分成重量相同的两堆(尽可能相同),相撞之后剩下的石头就是最小的。进一步转化成容量为重量总喝一半的背包最多可以装多少质量的石头。这样就转化成了背包问题。 最后求结果时,我们所最多能装的时dp[target],那另一…...
CSS 图像、媒体和表单元素的样式化指南
CSS 图像、媒体和表单元素的样式化指南 1. 替换元素:图像和视频1.1 调整图像大小示例代码:调整图像大小 1.2 使用 object-fit 控制图像显示示例代码:使用 object-fit 2. 布局中的替换元素示例代码:Grid 布局中的图像 3. 表单元素的…...
寒武纪MLU370部署deepseek r1
文章目录 前言一、平台环境准备二、模型下载三、环境安装四、代码修改五、运行效果 前言 DeepSeek-R1拥有卓越的性能,在数学、代码和推理任务上可与OpenAI o1媲美。其采用的大规模强化学习技术,仅需少量标注数据即可显著提升模型性能,为大模…...
Spring的AOP的JoinPoint和ProceedingJoinPoint
Spring的AOP的JoinPoint 在Spring AOP中,JoinPoint 是一个核心接口,用于表示程序执行过程中的一个连接点(如方法调用或异常抛出)。它提供了访问当前被拦截方法的关键信息的能力。以下是关于 JoinPoint 的详细说明: 一…...
每日一道算法题
题目:单词接龙 II 给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则: 每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的…...
Node.js——body-parser、防盗链、路由模块化、express-generator应用生成器
个人简介 👀个人主页: 前端杂货铺 🙋♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…...
Java小白入门教程:两大类型的修饰符以及示例
目录 一、访问控制修饰符 1、default 就是啥都不写的那种 2、private 私有 3、public 公开 4、protected 受保护的 二、非访问控制修饰符 1、static 静态 2、final 最终 3、abstract 抽象 4、synchronized 锁 5、transient 瞬态 6、volatile 易变 一、访问控制修饰符…...
正则表达式入门
入门 1、提取文章中所有的英文单词 //1.先创建一个Pattern对象,模式对象,可以理解成就是一个正则表达式对象 Pattern pattern Pattern.compile("[a-zA-Z]"); //2.创建一个匹配器对象 //理解:就是 matcher匹配器按照p…...
云原生(五十二) | DataGrip软件使用
文章目录 DataGrip软件使用 一、DataGrip基本使用 二、软件界面介绍 三、附件文件夹到项目中 四、DataGrip设置 五、SQL执行快捷键 DataGrip软件使用 一、DataGrip基本使用 1. 软件界面介绍 2. 附加文件夹到项目中【重要】 3. DataGrip配置 快捷键使用:C…...
如何成为一名 Python 全栈工程师攻略
## 从零基础到全栈工程师:Python 学习路线(细化版) **目标:** 掌握 Python 编程,并能独立开发全栈应用。 **学习路线:** ### 第一阶段:Python 基础 (4-6 周) **目标:** 掌握 Pyt…...
无需云端服务器: 三步实现DeepSeek大模型本地化部署deepseek、Ollama和Chatbox
🎉无需云端!三步实现DeepSeek大模型本地化部署😎 还在为云端AI服务的高昂费用而苦恼?是否总担心数据隐私会在云端泄露?别愁啦!DeepSeek R1——这款与OpenAI o1性能相媲美的开源大模型,结合Olla…...
mysql教程
MySQL 教程 一、简介 MySQL 是一个开源的关系型数据库管理系统,广泛应用于各种规模的项目中。以下是一些基础知识和常用操作。 二、安装与启动 安装:根据操作系统选择合适的安装包进行安装。启动:通过命令行或服务管理工具启动 MySQL 服务…...
【自学笔记】JavaWeb的重点知识点-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 JavaWeb知识点一、基础概念二、项目结构三、Tomcat服务器四、数据库连接(JDBC)五、前端技术六、高级技术 总结 以下是JavaWeb知识点的MD格式…...
项目升级Sass版本或升级Element Plus版本遇到的问题
项目升级Sass版本或升级Element Plus版本遇到的问题 如果项目有需求需要用到高版本的Element Plus组件,则需要升级相对应的sass版本,Element 文档中有提示,2.8.5及以后得版本,sass最低支持的版本为1.79.0,所升级sass、…...
[EAI-028] Diffusion-VLA,能够进行多模态推理和机器人动作预测的VLA模型
Paper Card 论文标题:Diffusion-VLA: Scaling Robot Foundation Models via Unified Diffusion and Autoregression 论文作者:Junjie Wen, Minjie Zhu, Yichen Zhu, Zhibin Tang, Jinming Li, Zhongyi Zhou, Chengmeng Li, Xiaoyu Liu, Yaxin Peng, Chao…...
char和varchar的区别、varchar(?)中问号部分的含义、索引的作用
char和varchar的区别 char是固定长度类型,当输入字符不满设定的固定长度时依旧占用固定长度的空间,补充空字节。 最大长度为255个字符 优点:效率高,在涉及索引和排序时缺点:占用空间使用场景:存储密码的…...
.NET9增强OpenAPI规范,不再内置swagger
ASP.NETCore in .NET 9.0 OpenAPI官方文档ASP.NET Core API 应用中的 OpenAPI 支持概述 | Microsoft Learnhttps://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/openapi/overview?viewaspnetcore-9.0https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/ope…...
qsort应用
每天都会收到ai个礼物,到第n天的时候,然然发现他的宿舍被礼物搞得一团糟,所以然然打算到超市买一个柜子装礼物。但是超市有m个柜子,每个柜子都有不同的容量bi,然然想知道每个柜子最多可以装多少天的礼物(可…...
仿真设计|基于51单片机的贪吃蛇游戏
目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现(protues8.7) 程序(Keil5) 全部内容 资料获取 具体实现功能 利用单片机8*8点阵实现贪吃蛇游戏的控制。 仿真演示视频: 51-基于51单片机的贪吃蛇游…...
Linux内核中的页面错误处理机制与按需分页技术
在现代操作系统中,内存管理是核心功能之一,而页面错误(Page Fault)处理机制是内存管理的重要组成部分。当程序访问一个尚未映射到物理内存的虚拟地址时,CPU会触发页面错误异常,内核需要捕获并处理这种异常,以决定如何响应,例如加载缺失的页面、处理权限错误等。Linux内…...
Baklib推动企业知识管理创新与效率提升的全面探讨
内容概要 在当今数字化转型的背景下,有效的知识管理显得尤为重要。知识是企业的核心资产,而传统的管理方式往往无法充分发挥这些知识的价值。因此,企业亟需一种高效、灵活的解决方案来应对这一挑战。Baklib作为一款先进的企业级知识管理平台…...
NLP自然语言处理通识
目录 ELMO 一、ELMo的核心设计理念 1. 静态词向量的局限性 2. 动态上下文嵌入的核心思想 3. 层次化特征提取 二、ELMo的模型结构与技术逻辑 1. 双向语言模型(BiLM) 2. 多层LSTM的层次化表示 三、ELMo的运行过程 1. 预训练阶段 2. 下游任务微调 四、ELMo的…...
计算机毕业设计Python+CNN卷积神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
【编译原理实验二】——自动机实验:NFA转DFA并最小化
本篇适用于ZZU的编译原理课程实验二——自动机实验:NFA转DFA并最小化,包含了实验代码和实验报告的内容,读者可根据需要参考完成自己的程序设计。 如果是ZZU的学弟学妹看到这篇,那么恭喜你,你来对地方啦! 如…...
Hive:复杂数据类型之Map函数
Map函数 是Hive里面的一种复杂数据类型, 用于存储键值对集合。Map中的键和值可以是基础类型或复合类型,这使得Map在处理需要关联存储信息的数据时非常有用。 定义map时,需声明2个属性: key 和 value , map中是 key value 组成一个元素 key-value, key必须为原始类…...
C++ 中的引用(Reference)
在 C 中,引用(Reference)是一种特殊的变量类型,它提供了一个已存在变量的别名。引用在很多场景下都非常有用,比如函数参数传递、返回值等。下面将详细介绍 C 引用的相关知识。 1. 引用的基本概念和语法 引用是已存在…...
密码学的数学基础1-整数 素数 和 RSA加密
数学公式推导是密码学的基础, 故开一个新的课题 – 密码学的数学基础系列 素数 / 质数 质数又称素数。 一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数(规定1既不是质数也不是合数࿰…...
Java锁自定义实现到aqs的理解
专栏系列文章地址:https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标: 理解锁,能自定义实现锁通过自定义锁的实现复习Thread和Object的相关方法开始尝试理解Aqs, 这样后续基于Aqs的的各种实现将能更好的理解 目录 锁的…...
STM32-时钟树
STM32-时钟树 时钟 时钟...
android 圆形弹窗摄像头开发踩坑——源码————未来之窗跨平台操作
一、飘窗刷脸,拍照采用飘窗 刷脸认证安卓接口采用飘窗具有在不干扰用户主要操作的前提下以醒目方式引导用户完成认证,且能灵活定制样式以提升用户体验和认证效率的优点 二、踩坑只有一个扇形 <?xml version"1.0" encoding"utf-8&quo…...
markdown公式特殊字符
个人学习笔记 根号 在 Markdown 中,要表示根号 3,可以使用 LaTeX 语法来实现。常见的有以下两种方式: 行内公式形式:使用一对美元符号 $ 将内容包裹起来,即 $\sqrt{3}$ ,在支持 LaTeX 语法渲染的 Markdow…...
Web-3.0学习路线
方向学习内容✅ 区块链基础区块链、智能合约、共识机制✅ 智能合约Solidity / Rust(Ethereum / Solana)✅ 前端React.js, Next.js, Web3.js, ethers.js✅ 后端Node.js, Python, Golang(链上数据)✅ 存储IPFS, Arweave, Filecoin&a…...
【算法设计与分析】实验5:贪心算法—装载及背包问题
目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 掌握贪心算法求解问题的思想;针对不同问题,会利用贪心算法进行问题建模、求解以及时间复杂度分析&#x…...
使用 cmake
使用前注意 : CMake是一种跨平台的构建系统,它用于管理软件构建过程,尤其适合多语言、多配置的项目。CMake不直接构建软件,而是生成特定构建工具(如Makefile或Visual Studio项目)所需的配置文件。 如果仅仅使用 qt 编…...