动态内存管理(c语言)
我们通常开辟空间的方式
int val =20; //大小为4个字节
char arr[10] ={0} //开辟出一块连续的空间且大小为10
但是上面开辟空间方式的特点
1.空间开辟大小是固定的
2.数组在声明得时候,必须指定数组得长度,它所需要得内存在编译时分配
但是以上的方式不能满足所有情况,有时候我们需要空间的大小在程序运行的时候才能知道,
那数组编译的方式就不能满足了,你那就可以使用动态内存
一.堆区,栈区,静态区
1.栈区:
1)遵循自动分配与释放原则
当函数被调用时,函数内的局部变量,函数的参数灯会在栈上分配空间,函数执行完毕后,这些内存会自动被释放
2)后进先出原则
比如说嵌套函数的时候,内层函数的局部变量会先入栈,当内存函数返回后,其局部变量先出栈,外层函数才能继续执行并访问其自身的局部变量
3)空间有限。如果在栈上分配了过多的内存,可能会导致栈溢出,程序出现错误甚至崩溃
2.堆区
动态分配与释放:堆区的内存分配和释放由程序员手动控制,通过函数malloc,calloc,realloc等函数可以在栈上申请空间,使用完毕后,必须通过free函数释放内存,否则会导致内存泄漏,会一直占用系统资源,知道程序借宿
内存空间较大:堆区的内存空间相对栈区来说要大得多,其大小通常只限于计算机的物理内存和虚拟内存的大小。这使得堆区适用于存储大量的数据或动态生成的数据结构,如数组,链表,树等
分配灵活:
根据程序的实际需求动态申请任意大小的内存块
碎片化问题:
由于堆区的内存分配和释放时动态,经过多次申请和释放后,可能会导致内存碎片化
,内存利用率降低
3.静态区:
全局生命周期:
静态区存储的是全局变量和静态变量,这些变量在程序整个生命周期都有效,直到程序结束
初始化规则
未初始化的全局变量和静态变量会自动初始化为0和空指针,初始化的变量就按照初始化的进行
作用域的限制
全局变量作用域是整个程序,可以在如何函数中访问和修改;而静态局部变量的作用域仅限于定义它的函数内部,但它在函数多次调用后会保持其值不变
二.动态内存函数
1.malloc函数
头文件 #include<stdlib.h>
这个函数向内存申请一块连续可用的空间,并指向这块空间的指针
如果开辟成功,则返回一个指向该块空间的指针
如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要检查
返回值为void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候由操作者自己决定
函数格式
函数参数的意思:size表示要分配的内存块的大小,单位是字节
void*malloc(size_t size)
2.free函数
头文件 #include<stdlib.h>
free函数用来释放动态开辟的内存
1.如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的。
2.如果参数ptr是NULL指针,则函数什么事都不做
void free (void* ptr);
malloc函数和free函数使用如下
#include<string.h>
#include<stdio.h>
#include<errno.h>
#include<stdlib.h>
int main()
{//向内存申请空间,且未初始化int* p = (int*)malloc(20);//判断空间是否开辟成功if (p == NULL){//判断错误的原因//strerror函数是用来判断错误的原有printf("%s\n", strerror(errno));return 1;}//使用int i = 0;for (i = 0; i < 5; i++){//这俩种形式等价//*(p + i) = i + 1;//printf("%d ", *(p + i));//p[i] = i + 1;//printf("%d ", p[i]);}//释放free(p);p = NULL;return 0;
}
注意:
1.把p被free释放后,p仍然指向某一个地址,需要对其设置为空指针,避免出现空指针
2.若malloc函数开辟空间失败,则会返回空指针,所以需要对malloc函数的返回值进行检查
如果malloc函数开辟的空间太大,则会开辟失败
3.calloc函数
头文件:#include<stdio.h>
calloc也是用来开辟动态空间的,但它会把这块空间每个字节初始化为0
参数1:num表示要分配的元素个数,参数2:表示每个元素的大小
void* calloc (size_t num, size_t size);
calloc函数和free函数的使用
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>int main()
{//开辟动态空间int* p = (int*) calloc(10, sizeof(int));//判断是否开辟成功if (p == NULL){printf("%s", strerror(errno));return 1;}//使用int i = 0;//进行空间的遍历for (i = 0; i < 10; i++){printf("%d ", p[i]);}return 0;//释放内存free(p);p = NULL;
}
程序运行
4.realloc函数
头文件:#include<stdlib.h>
realloc函数开始实现对动态开辟空间大小的调整
格式
参数1:
ptr
是一个指向先前通过malloc
、calloc
或realloc
函数分配的内存块的指针,也就是要调整内存的地址参数2:size表示重新分配后内存块的大小
返回值:realloc函数返回后,返回值为调整之后的空间起始地址
void* realloc (void* ptr, size_t size);
realloc函数的应用
#include<stdio.h>
#include<stdlib.h>
%include<errno.h>int main()
{//开辟动态空间int* p = (int*) calloc(10, sizeof(int));//判断是否开辟成功if (p == NULL){printf("%s", strerror(errno));return 1;}
//重新分配内存使其能容纳80个字节的空间,成功使用
//realloc函数后,原来由calloc函数开辟的空间会被回收
//所以不需要对p进行释放,如果释放,则会导致程序崩溃int* pa = realloc(p, 80);if (pa == NULL){printf("%s", strerror(errno));return 1;}//使用int i = 0;for (i = 0; i < 20; i++){*(pa+i) = i + 1;printf("%d ",*(pa+i));}//释放free(pa);pa = NULL;
}
程序运行:
realloc在调整内存空间有俩种情况
1.原有空间之后有足够大的空间
2.原有空间之后没有足够大的空间
若为情况1
使用realloc函数后,直接在原有的空间后直接扩展,最终成为一块连续空间,且原有的空间数据不发生变化
若为情况2
原有空间之后没有足够的空间,如果要扩展的话,在原有的堆空间另找一个合适大小的连续空间来使用,这时函数返回的是一个新空间的地址
情况1:在原来的空间直接进行扩展
情况2:没有找到足够的空间,在另一处又开辟了一个空间
三.动态内存中常见的错误
void test(){int *p = (int *)malloc(INT_MAX/4);*p = 20;free(p);}
这段代码有什么问题呢👆
没有对malloc函数是否成功开辟空间进行判断,如果p为NULL,对NULL的解引用是错误的
void test(){int i = 0;int *p = (int *)malloc(10*sizeof(int));if(NULL == p){exit(EXIT_FAILURE);}for(i=0; i<=10; i++){*(p+i) = i;}free(p);
}
这段代码有什么问题呢👆
对动态开辟的空间进行越界访问,且最后p没有置为NULL
void test(){int a = 10;int *p = &a;free(p);//ok?}
对非动态开辟的内存进行free,free之后也要把指针p指向的地址设置为NULL
void test(){int *p = (int *)malloc(100);p++;free(p);}
因为p++,所以p并没有在动态内存的起始地址,所以free仅释放了一部分动态内存
void test(){int *p = (int *)malloc(100);free(p);free(p);、}
对同一块动态内存多次释放
void test(){int *p = (int *)malloc(100);if(NULL != p){*p = 20;}}int main(){test();while(1);}
使用过后并没有对malloc开辟的动态空间进行free,free之后,要把指针p指向的空间设置为NULL
四.经典的笔试题
void GetMemory(char *p){p = (char *)malloc(100);}void Test(void){char *str = NULL;GetMemory(str);strcpy(str, "hello world");printf(str);}
请问这段代码错误出在哪👆
1.调用GetMemory的时候,str的传参为值传递,p是str临时变量,所以再GetMemory函数内部将动态内存的地址存放在p中,不会影响str。所以在GetMemory函数返回之后
,str中依然是空指针。strcpy函数就会调用失败原因是对NULL的解引用操作,程序会崩溃。
2.malloc是否成功申请空间没有检验
3.GetMemory函数内容malloc申请的空间没有机会释放
,造成了内存泄漏
char *GetMemory(void){char p[] = "hello world";return p;}void Test(void){char *str = NULL;str = GetMemory();printf(str);}
请问这段代码错误出在哪👆
这是一个栈空间的问题GetMemory函数内部创建的数组是临时的,虽然返回了数组的起始地址给了str,但是数组的内存出了GetMemory函数就被回收了,而str依然保存了数组的起始地址,这时如果使用str,str就是野指针,也就是说访问值是随机的
void GetMemory(char **p, int num){*p = (char *)malloc(num);}void Test(void){char *str = NULL;GetMemory(&str, 100);strcpy(str, "hello");printf(str);}
请问这段代码错误出在哪👆
1.没有用free释放malloc开辟的空间,造成内存泄漏
2.并没有对malloc是否开辟出空间进行检验
void Test(void){char *str = (char *) malloc(100);strcpy(str, "hello");free(str);if(str != NULL){strcpy(str, "world");printf(str);}}
请问这段代码错误出在哪👆
把free把指针所指向的空间释放后,并没有把指针置为NULL,形成了悬空指针
因为虽然 str 指针本身没有被赋值为
NULL
,但其指向的内存已经被释放,再使用这个指针会导致未定义行为,如果继续执行,可能会导致程序崩溃产生不可预料的结果
五.柔性数组
在c99中,结构体中最后一个元素允许是未知大小的数组,这就是柔性数组
柔性数组的创建
第一种方式👇
typedef struct st_type{int i;int a[0];//柔性数组成员
}type_a;
第二种方式👇
typedef struct st_type{int i;int a[];//柔性数组成员
}type_a;
柔性数组的特点
1.结构体柔性数组成员前必须至少一个其它成员
2.sizeof返回的大小不包含柔性数组的大小
3.包含柔性数组成员的结构体应该用malloc函数进行内存的动态分配,并且分配的大小应该大于结构体的大小,以适应柔性数组的预期大小
1.sizeof返回的大小不包含柔性数组的大小
#include<stdio.h>
struct s
{int i;int a[0];//柔性数组成员
};int main()
{printf("%d ", sizeof(struct s));return 0;
}
程序运行
3.使用malloc函数进行柔性数组的空间分配
struct S
{int n;char c;int arr[];};int main()
{//柔性数组创建空间,+号前头的是不包含柔性数组大小的空间,后边是创建了//元素个数为10的柔性数组struct S* ps = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(int));if (ps == NULL){printf("%p\n", strerror(errno));return 1;}//柔性数组的使用int i = 0;for (i = 0; i < 10; i++){ps->arr[i] = i + 1;printf("%d ", ps->arr[i]);}//释放free(ps);ps = NULL;
}
代码运行
结语:
限于水平,本篇文章不足之处在所难免,还望读者见谅,如有问题,请大家指正下。
相关文章:
动态内存管理(c语言)
我们通常开辟空间的方式 int val 20; //大小为4个字节 char arr[10] {0} //开辟出一块连续的空间且大小为10 但是上面开辟空间方式的特点 1.空间开辟大小是固定的 2.数组在声明得时候,必须指定数组得长度,它所需要得内存在编译时分配 但是以上的方式不能…...
SLF4J日志快速上手
tags: SpringBoot 日志 快速上手 SLF4J日志快速上手 第一步:添加日志相关配置 logging:level:root: INFO # 设置全局日志级别为 INFO,只显示重要的日志信息(略过 DEBUG 和 TRACE 级别)# org.hibernate.SQL: DEBUG # 对于 Hiber…...
【PyTorch】(基础三)---- 图像读取和展示
图像读取和展示 pytorch本身并不提供图像的读取和展示功能,利用pytorch执行计算机视觉任务的时候,通常是利用opencv等工具先进行图像处理,然后将结果转化成tensor类型传递给pytorch,在pytorch执行之后,也可以将tensor…...
【纪念365天】我的创作纪念日
过去的一年 没有注意加入csdn已经有一年了。 这几天翻看小猴儿的通知才发现时间来到了一年的纪念日。稍稍思索想要将这一段时间的学习到的知识以及偶然遇到的机遇做一下总结。 上一次写纪念日是来到csdn128天的时候, 200天前我的学习状态是非常疯狂的。 只记得我当时…...
flink学习(7)——window
概述 窗口的长度(大小): 决定了要计算最近多长时间的数据 窗口的间隔: 决定了每隔多久计算一次 举例:每隔10min,计算最近24h的热搜词,24小时是长度,每隔10分钟是间隔。 窗口的分类 1、根据window前是否调用keyBy分为键控窗口和非键控窗口…...
第十六届蓝桥杯模拟赛第二期题解—Java
第十六届蓝桥杯模拟赛/校赛第二期个人题解,有错误的地方欢迎各位大佬指正 问题一(填空题) 【问题描述】 如果一个数 p 是个质数,同时又是整数 a 的约数,则 p 称为 a 的一个质因数。 请问, 2024 的最大的质因数是多少? …...
数据库-MySQL-Dynamic-Datasource源码解析
文章目录 前言一、简介二、整体流程三、核心解析四、总结 前言 多数据源的应用在日常项目中也是很常见的场景。 dynamic-datasource的功能,用起来的确很方便,只需要一个DS注解,加上一些简单的配置即可完成多数据源的切换。究竟是怎么做到的…...
uniapp+vue2+uview2.0导航栏组件二次封装
样式 代码 <template><view class"navBar"><u-navbar :title"title" :titleColor"titleColor" :bgColor"bgColor" :safeAreaInsetTop"safeAreaInsetTop":autoBack"true" leftClick"leftClic…...
【Git 工具】用 IntelliJ IDEA 玩转 Git 分支与版本管理
文章目录 一、使用 IDEA 配置和操作 Git1.1 查看 Idea 中的 Git 配置1.2 克隆 Github 项目到本地 二、版本管理2.1 提交并推送修改2.2 拉取远程仓库2.3 查看历史2.4 版本回退 三、分支管理3.1 新建分支3.2 切换分支3.2 合并分支3.4 Cherry-Pick 参考资料 一、使用 IDEA 配置和操…...
异或-java-leetcode
1486.数组异或操作 给你两个整数,n 和 start 。 数组 nums 定义为:nums[i] start 2*i(下标从 0 开始)且 n nums.length 。 请返回 nums 中所有元素按位异或(XOR)后得到的结果。 示例 1: 输入…...
Jmeter中的测试片段和非测试原件
1)测试片段 1--测试片段 功能特点 重用性:将常用的测试元素组合成一个测试片段,便于在多个线程组中重用。模块化:提高测试计划的模块化程度,使测试计划更易于管理和维护。灵活性:可以通过模块控制器灵活地…...
NeurIPS 2024 有效投稿达 15,671 篇,数据集版块内容丰富
NeurIPS,全称 Neural Information Processing Systems Conference,是神经信息处理系统的年度学术会议。该会议始于 1987 年,当时名为 NIPS。随着人工智能领域的快速发展,其影响力逐渐扩大,被越来越多的研究者和企业关注…...
力扣101. 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。 提示: 树中节点数目在范围 [1, 1000] 内-100 < Node.val < 100 进阶:你可以运用递归和迭代两种方法解决这个问题吗? 代码: /*** Definition for a binary …...
Ubuntu 环境下的 C/C++ 编译与调试配置
详细教学文档:Ubuntu 环境下的 C/C 编译与调试配置 本文档将手把手引导你完成在 Ubuntu 环境中设置 VS Code 的 tasks.json 和 launch.json,实现以下目标: 统一管理输出文件:将所有编译生成的可执行文件统一存放到项目的 build …...
『VUE』36. Vue的应用概念(分析流程)
目录 创建应用挂载应用可执行文件公共资源总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 创建应用 首先引入createApp ,然后借助createApp 创造一个app对象 main.js import { createApp } from "vue"; import A…...
《基于FPGA的便携式PWM方波信号发生器》论文分析(三)——数码管稳定显示与系统调试
一、论文概述 基于FPGA的便携式PWM方波信号发生器是一篇由任青颖、庹忠曜、黄洵桢、李智禺和张贤宇 等人发表的一篇期刊论文。该论文主要研究了一种新型的信号发生器,旨在解决传统PWM信号发生器在移动设备信号调控中存在的精准度低和便携性差的问题 。其基于现场可编…...
mac上的建议xftp 工具
mac上的建议xftp 工具 最近使用mac比较频繁了,但是第一次重度使用mac里面有很多的工具都是新的,有的window版本的工具无法使用。 xftp 的平替 Cyberduck 从它的官网上下载是免费的,但是如果使用 Apple store 要花费198呢。这不就剩下一大笔…...
Hive | Hive 表如何查看所有分区
文章目录 概述使用 SHOW PARTITIONS 命令查看特定分区的信息获取详细的分区信息总结 概述 Apache Hive 是一个构建在 Hadoop 之上的数据仓库工具,它提供了 SQL 类似的查询语言(称为 HiveQL),使得用户能够更容易地进行大数据处理和…...
MySQL系列之数据类型(Numeric)
导览 前言一、数值类型综述二、数值类型详解1. NUMERIC1.1 UNSIGNED或SIGNED1.2 数据类型划分 2. Integer类型取值和存储要求3. Fixed-Point类型取值和存储要求4. Floating-Point类型取值和存储要求 结语精彩回放 前言 MySQL系列最近三篇均关注了和我们日常工作或学习密切相关…...
4.6 JMeter HTTP信息头管理器
欢迎大家订阅【软件测试】 专栏,开启你的软件测试学习之旅! 文章目录 前言1 HTTP信息头管理器的位置2 常见的HTTP请求头3 添加 HTTP 信息头管理器4 应用场景 前言 在 JMeter 中,HTTP信息头管理器(HTTP Header Manager)…...
fpga 综合与优化设计
目录 Quartus Prime优化设置 1. 分析与综合设置 2. 物理综合优化 3. 适配设置 描述方法对综合的影响 1. 操作符的应用差异 2. 条件语句和分支语句的应用差异 3. 描述方式对综合电路的影响 优化设计方法 1. FPGA设计的基本原则 2. 常用优化设计方法 优化主要包括 4 个…...
计算机毕业设计Hadoop+Spark音乐推荐系统 音乐预测系统 音乐可视化大屏 音乐爬虫 HDFS hive数据仓库 机器学习 深度学习 大数据毕业设计
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
C嘎嘎探索篇:栈与队列的交响:C++中的结构艺术
C嘎嘎探索篇:栈与队列的交响:C中的结构艺术 前言: 小编在之前刚完成了C中栈和队列(stack和queue)的讲解,忘记的小伙伴可以去我上一篇文章看一眼的,今天小编将会带领大家吹奏栈和队列的交响&am…...
摄像头原始数据读取——opencv(cv::VideoCapture)
摄像头原始数据读取——opencv(cv::VideoCapture) 测试代码test.cpp #include <iostream> #include <string>#include <opencv2/opencv.hpp>std::string pixeformatcodec2string(int codec) {char pixeformat_name[5] { (char)((codec >> 0) & …...
unreal engine5中多个摄像机切换
UE5系列文章目录 文章目录 UE5系列文章目录前言一、思路二、具体实现 前言 unreal engine5中使用蓝图实现多个相机切换 一、思路 在Unreal Engine 5中,如果你想要在控件蓝图(Widget Blueprint)中获取场景摄像机的信息,可以按照…...
ensp静态路由实验
一、实验目的 1、熟练掌握交换机的基本配置命令 2、熟练掌握静态路由的使用方法 3. 熟练掌握交换机端口模式 二、实验内容 需求: 根据要求利用现有实验设备组建小型局域网 实验设备: 交换机S37002台;PC机2台;路由器2台。 …...
【在Linux世界中追寻伟大的One Piece】多线程(二)
目录 1 -> 分离线程 2 -> Linux线程互斥 2.1 -> 进程线程间的互斥相关背景概念 2.2 -> 互斥量mutex 2.3 -> 互斥量的接口 2.4 -> 互斥量实现原理探究 3 -> 可重入VS线程安全 3.1 -> 概念 3.2 -> 常见的线程不安全的情况 3.3 -> 常见的…...
Git中HEAD、工作树和索引的区别
在Git版本控制系统中,HEAD、工作树(Working Tree)和索引(Index)是三个非常重要的概念,它们分别代表了不同的状态或区域,下面我将对这三个概念进行详细的解释。 HEAD 定义:HEAD是一…...
洛谷 P1156 垃圾陷阱(搜索 DFS)
题目传送门https://www.luogu.com.cn/problem/P1156 解题思路 本题数据过水,可以使用 dfs。 对于每个垃圾,吃掉或者堆着。 然后考虑剪枝: 如果已经等不到下一个垃圾的到来,直接 return; 如果当前状态已经搜过&am…...
nodepad配置c/c++ cmd快速打开创建项目文件
前提:下载MinGw,并且配置环境变量 点击阅读次篇文章配置MinGw 无论是哪个编译器,执行c文件都是经历以下步骤: 编译文件生成exe文件执行该exe文件 我们先手动完成这两部 手动编译文件使用指令 gcc {你的c文件} -o {生成文件名}生成exe文件 第二步运行exe直接点击该文…...
Excel与PPT:职场两大软件的应用比拼
在职场环境中,Excel和PPT无疑是两款最为常用的办公软件。它们各自承担着不同的职责,为职场人士提供了强大的数据处理和演示功能。然而,哪款软件应用得更多,却并非一概而论,而是取决于个人的工作性质、岗位需求以及个人…...
春秋云境 CVE 复现
CVE-2022-4230 靶标介绍 WP Statistics WordPress 插件13.2.9之前的版本不会转义参数,这可能允许经过身份验证的用户执行 SQL 注入攻击。默认情况下,具有管理选项功能 (admin) 的用户可以使用受影响的功能,但是该插件有一个设置允许低权限用…...
文件系统的作用
在一个完整的嵌入式系统中,进行一个简单的操作(如读取传感器数据并保存到文件)通常会涉及多个步骤。这些步骤包括硬件初始化、数据采集、处理、存储以及与外部系统交互。以下是一个通用的操作流程及文件系统在其中的作用。 嵌入式系统的操作流…...
mysql低版本中update_time不自动更新问题
在mysql低版本时,update_time只有插入时才会自动插入当前时间,更新不会改变。 MySQL 5.7 及以上版本对于TIMESTAMP类型字段有自动更新功能相关特性在 MySQL 5.7以上版本 中,如果将一个TIMESTAMP类型的列设置为ON UPDATE CURRENT_TIMESTAMP属…...
【二叉树】【2.1遍历二叉树】【刷题笔记】【灵神题单】
关注二叉树的三个问题: 什么情况适合自顶向下?什么时候适合用自底向上?一般来说,DFS的递归边界是空节点,什么情况下要额外把叶子节点作为递归边界?在什么情况下,DFS需要有返回值?什…...
【深度学习】【RKNN】【C++】模型转化、环境搭建以及模型部署的详细教程
【深度学习】【RKNN】【C】模型转化、环境搭建以及模型部署的详细教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【RKNN】【C】模型转化、环境搭建以及模型部署的详细教程前言模型转换--pytorch转rknnpytorch转onnxonnx转rkn…...
刷题日常(移动零,盛最多水的容器,三数之和,无重复字符的最长子串)
移动零 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 俩种情况: 1.当nums[i]为0的时候 直接i 2.当nums[i]不为0的时候 此时 …...
【单元测试】【Android】JUnit 4 和 JUnit 5 的差异记录
背景 Jetbrain IDE 支持生成 Test 类,其中选择JUnit5 和 JUnit,但是感觉这不是标准的单元测试,因为接口命名吧。 差异对比 两者生成的单测API名称同原API,没加test前缀的。使用差异主要表现在: setUp & …...
LangChain——HTML文本分割 多种文本分割
Text Splitters 文本分割器 加载文档后,您通常会想要对其进行转换以更好地适合您的应用程序。最简单的例子是,您可能希望将长文档分割成更小的块,以适合模型的上下文窗口。 LangChain 有许多内置的文档转换器,可以轻松地拆分、组…...
Spring事务和事务传播机制
博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 目录 1.事务 1.1 什么是事务? 1.2 为什么需要事务? 1.3 事务的操作 2. Spring 中的事务 1. 编程式事务 2. 声明式事务Tra…...
STM32F103外部中断配置
一、外部中断 在上一节我们介绍了STM32f103的嵌套向量中断控制器,其中包括中断的使能、失能、中断优先级分组以及中断优先级配置等内容。 1.1 外部中断/事件控制器 在STM32f103支持的60个可屏蔽中断中,有一些比较特殊的中断: 中断编号13 EXTI…...
ChatGPT的应用场景:开启无限可能的大门
ChatGPT的应用场景:开启无限可能的大门 随着人工智能技术的快速发展,自然语言处理领域迎来了前所未有的突破。其中,ChatGPT作为一款基于Transformer架构的语言模型,凭借其强大的语言理解和生成能力,在多个行业和场景中…...
计算机毕业设计 | SpringBoot+vue社区医院管理系统(附源码+论文)
1,绪论 1.1 研究背景 互联网概念的产生到如今的蓬勃发展,用了短短的几十年时间就风靡全球,使得全球各个行业都进行了互联网的改造升级,标志着互联网浪潮的来临。在这个新的时代,各行各业都充分考虑互联网是否能与本行…...
直播实时美颜平台开发详解:基于视频美颜SDK的技术路径
视频美颜SDK作为实现实时美颜的关键技术,为开发者提供了高效、灵活的解决方案。本篇文章,小编将以“基于视频美颜SDK的技术路径”为主题,深入解析直播实时美颜平台的开发要点。 一、视频美颜SDK的作用与优势 视频美颜SDK是一种集成化的开发工…...
一个专为云原生环境设计的高性能分布式文件系统
大家好,今天给大家分享一款开源创新的分布式 POSIX 文件系统JuiceFS,旨在解决海量云存储与各类应用平台(如大数据、机器学习、人工智能等)之间高效对接的问题。 项目介绍 JuiceFS 是一款面向云原生设计的高性能分布式文件系统&am…...
【Elasticsearch】开启大数据分析的探索与预处理之旅
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
【算法】欧几里得与拓展欧几里得算法
目录 一、欧几里得算法 二、拓展欧几里得算法 2.1 裴蜀定理 2.2 拓展欧几里得算法 2.3 例题 三、线性同余方程 3.1 概念 3.2 例题 一、欧几里得算法 欧几里得算法又称辗转相除法,可用于求解两个数的最大公约数 其思路: gcd(a, b) gcd(b, a%b…...
组合数的求法
1.如果是多组查询的话,需要用数组去储存阶乘的值 n!/(m!(n-m)!) P4071 [SDOI2016] 排列计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<cstdio> #include<iostream> #include<map> #include<cstring> #include<cmath&g…...
【环境搭建】更新Docker Compose到v2.x版本以支持--profile选项
Docker版本陈旧也是搭建的环境起不来的一个重要原因,比如 --profile 选项是 Docker 20.10.0 版本及以上版本才开始支持的,在 Docker Compose v2.1(及以上版本)中引入用于对服务进行分组和按需启动。 更新 Docker Compose 到 v2.x…...
解决 java -jar 报错:xxx.jar 中没有主清单属性
问题复现 在使用 java -jar xxx.jar 命令运行 Java 应用程序时,遇到了以下错误: xxx.jar 中没有主清单属性这个错误表示 JAR 文件缺少必要的启动信息,Java 虚拟机无法找到应用程序的入口点。本文将介绍该错误的原因以及如何通过修改 pom.xm…...