C语言动态内存管理
1.为什么要有动态内存分配
内存开辟方式:
int val = 20;//在栈空间上开辟四个字节
char arr[10] = {0};//在栈空间上开辟10个字节的连续空间
开辟空间的方式特点
- 空间开辟大小是固定德的
- 数组在申明的时候,必须指明数组的长度,数组空间一旦确定了大小不能调整
但是对空间的要求,不仅仅是上述的情况,有时需要的空间大小在程序运行时才能知道,数组的编译时开辟的空间无法满足要求
C语言引入了动态内存开辟,程序员可以自己申请和释放空间,比较灵活
2.malloc 和free
2.1 malloc
c语言提供的一个动态内存开辟的函数
void* malloc (size_t size);
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针
- 如果开辟成功,则返回一个指向开辟好空间的指针
- 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查
- 返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定
- 如果参数size为0,malloc的行为是标准未定义的,取决于编译器
2.2 free
c语言提供了另一个函数free,专门用来做动态内存释放和回收的,函数原型如下
void free (void* ptr);
free函数用来释放动态开辟的内存
- 如果参数ptr指向的空间不是动态开辟的,那free函数的行为是未定义的
- 如果参数ptr是NULL指针,则函数什么事都不做
malloc和free都声明在stdlib.h头文件中
例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{int num = 0;scanf("%d", &num);int arr[num] = {0};int* ptr = NULL;ptr = (int*)malloc(num*sizeof(int));if(NULL != ptr)//判断ptr指针是否为空{int i = 0;for(i=0; i<num; i++){*(ptr+i) = 0;}}free(ptr);//释放ptr所指向的动态内存ptr = NULL;//是否有必要?return 0;
}
3.calloc和realloc
3.1calloc
c语言提供一个函数叫calloc,calloc函数也用来动态内存分配,原型如下
void* calloc (size_t num, size_t size);
- 函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0
- 与函数malloc的区别只在于calloc会在返回地址前把申请的空间的每个字节初始化为全0
例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{int *p = (int*)calloc(10, sizeof(int));if(NULL != p){int i = 0;for(i=0; i<10; i++){printf("%d ", *(p+i));}}free(p);p = NULL;return 0;
}
输出结果:
0 0 0 0 0 0 0 0 0 0
如果对申请的空间的内容要求初始化,可以用calloc函数
3.2 realloc
- realloc函数的出现让动态内存管理更加灵活
- realloc函数可以对动态开辟的内存大小进行调整
函数原型如下
void* realloc (void* ptr, size_t size);
- ptr是要调整的内存地址
- size是调整之后的大小
- 返回值为调整之后的内存的起始位置
- 这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到新的空间
- realloc在调整内存空间的是存在两种情况
- 情况1:原有空间之后有足够大的空间
- 情况2:原有空间之后没有足够大的空间
情况1
当是情况1时,要扩展内存直接在原有内存之后直接追加空间,原有空间的数据不发生变化
情况2
当是情况2时,原有空间之后没有足够多的空间,扩展的方法是:在堆空间上另外找一个合适大小的连续空间来使用,这样函数返回的是一个新的内存地址
#include <stdio.h>
#include <stdlib.h>int main()
{int* ptr = (int*)malloc(100);if (ptr != NULL){//业务处理}else{return 1;}//扩展容量//代码1 - 直接将realloc的返回值放到ptr中ptr = (int*)realloc(ptr, 1000);//这样可以吗?(如果申请失败会如何?)//代码2 - 先将realloc函数的返回值放在p中,不为NULL,在放ptr中int* p = NULL;p = realloc(ptr, 1000);if (p != NULL){ptr = p;}//业务处理free(ptr);return 0;
}
4.常见的动态内存的错误
4.1对NULL指针的解引用操作
void test()
{int* p = (int*)malloc(INT_MAX / 4);* p = 20;//如果p的值是NULL,就会有问题free(p);
}
4.2对动态开辟空间的越界访问
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;//当i是10的时候越界访问}free(p);}
4.3对非动态开辟内存使用free释放
void test()
{int a = 10;int* p = &a;free(p);//ok?}
4.4使用free释放一块动态开辟内存的一部分
void test()
{int* p = (int*)malloc(100);p++;free(p);//p不再指向动态内存的起始位置
}
4.5对同一块动态内存多次释放
void test()
{int* p = (int*)malloc(100);free(p);free(p);//重复释放
}
4.6动态赖皮内存忘记释放(neicunxielou)
void test()
{int *p = (int *)malloc(100);if(NULL != p){*p = 20;}
}int main()
{test();while(1);
}
忘记释放不再使用的动态开辟的空间会造成内存泄漏
切记:动态开辟的空间一定要释放,并且正确释放
5.动态内存练习题
5.1动态内存题目1:
void GetMemory(char *p)
{p = (char *)malloc(100);
}
void Test(void)
{char *str = NULL;GetMemory(str);strcpy(str, "hello world");printf(str);
}
解释:在GetMemory函数中,虽然为p分配了内存,但函数没有对p指向的内存进行初始化。在Test函数中,str初始化为NULL,然后调用GetMemory函数试图为str分配内存,接着使用strcpy函数向str指向的未初始化内存中复制字符串“hello”,这是一种危险的操作,可能会导致程序崩溃。最后在释放str指向的内存后将str置为NULL,这一步是正确的内存管理操作。
5.2 动态内存题目2
char *GetMemory(void)
{char p[] = "hello world";return p;
}
void Test(void)
{char *str = NULL;str = GetMemory();printf(str);
}
解释:当GetMemory函数返回时,局部数组p的生命周期结束。虽然函数返回了p的地址,但由于p是局部变量,其占用的栈空间可能会被其他函数调用所覆盖。在Test函数中,str接收了GetMemory返回的地址,但是这个地址所指向的内存内容已经不再是有效的“hello world”字符串了,因为p所在的栈空间已经被释放(函数调用结束)。当执行printf(str);时,结果是不可预测的。可能会输出乱码,也可能会导致程序崩溃,因为str指向的是已经被释放的栈内存。
5.3 动态内存题目3
void GetMemory(char **p, int num)
{*p = (char *)malloc(num);
}
void Test(void)
{char *str = NULL;GetMemory(&str, 100);strcpy(str, "hello");printf(str);
}
解释:在GetMemory函数中,通过*p=(char )malloc(num);成功为p(也就是Test函数中的str)分配了100字节的内存空间。
在Test函数中,str初始为NULL,经过GetMemory函数调用后,str指向了新分配的内存块。然后strcpy(str, “hello”);将“hello”字符串(包括结尾的’\0’共6个字节)正确地复制到str所指向的内存块中。最后printf(str);会输出字符串“hello”。但是,代码存在一个问题,就是没有释放str所指向的内存。在程序结束后,这部分内存会造成内存泄漏。
5.4动态内存题目4
void Test(void)
{char *str = (char *) malloc(100);strcpy(str, "hello");free(str);if(str != NULL){strcpy(str, "world");printf(str);}
}
解释:当调用free(str)后,str所指向的内存已经被标记为可重用状态。操作系统或者运行时环境可能会立即将这块内存用于其他目的。在if语句中,对已经释放的内存进行strcpy操作,可能会导致程序崩溃。因为这块内存可能已经被其他部分的程序重新分配或者被系统用于其他用途,写入操作可能会破坏其他数据结构或者导致访问违规。如果程序没有因为这个未定义行为而崩溃,printf(str)会尝试输出str所指向的内容,由于之前strcpy操作的不确定性(因为是对已释放内存的操作),输出结果也是不可预测的。
6.柔性数组
c99中,结构中的最后一个元素允许是未知大小的数组,叫做柔性数组成员
typedef struct st_type
{int i;int a[0];//柔性数组成员
}type_a;
有些编译器会报错改成
typedef struct st_type
{int i;int a[];//柔性数组成员
}type_a;
6.1柔性数组的特点
- 结构中的柔性数组成员前面必须至少一个其他成员
- sizeof返回的这种结构大小不包括柔性数组的内存
- 包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小
typedef struct st_type
{int i;int a[0];//柔性数组成员
}type_a;
int main()
{printf("%d\n", sizeof(type_a));//输出的是4return 0;
}
6.2柔性数组的使用
//代码1
#include <stdio.h>
#include <stdlib.h>
int main()
{int i = 0;type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));//业务处理p->i = 100;for(i=0; i<100; i++){p->a[i] = i;}free(p);return 0;
}
这样柔性数组成员a获得了100个整型元素的连续空间
6.3柔性数组的优势
//代码2
#include <stdio.h>
#include <stdlib.h>typedef struct st_type
{int i;int *p_a;
}type_a;int main()
{type_a *p = (type_a *)malloc(sizeof(type_a));p->i = 100;p->p_a = (int *)malloc(p->i*sizeof(int));//业务处理for(i=0; i<100; i++){p->p_a[i] = i;}//释放空间free(p->p_a);p->p_a = NULL;free(p);p = NULL;return 0;
}
上述代码1和代码2可以完成相同的功能,但是方法1实现有两个好处
第一个好处:方便内存释放
如果代码是在一个给别人用的函数中,在里面做了二次内存分配,并把整个结构体返回给用户,用户调用free可以释放结构体,但是用户并不知道结构体内的成员也需要free,所以,把结构体的内存以及成员的内存一次性分配好,并返回用户一个结构体指针,用户做一次free就可以把内存全部释放
第二个好处:有利于访问速度
连续的内存有益于提高访问速度,有有益于减少内存碎片
拓展:C语⾔结构体⾥的数组和指针
7.总结c/c++中程序内存区域划分
c/c++程序内存分配的几个区域
1.栈区(stack):在执行函数时,函数内部局部变量的存储单元都可以在栈上创建,函数执行结束时,这些存储单元自动被释放,栈内存分配橼酸内酯处理器的指令集中,效率很高,但是分配内存容量有限,栈区主要存放运行函数而分配的局部变量,函数参数,返回数据,返回地址等
2.堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时os回收,分配方式类似于链表
3.数据段(静态区)(static):存放全局变量,静态数据,程序结束后有系统释放
4.代码段:存放函数体(类成员函数和全局函数)的二进制代码
相关文章:
C语言动态内存管理
1.为什么要有动态内存分配 内存开辟方式: int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间开辟空间的方式特点 空间开辟大小是固定德的数组在申明的时候,必须指明数组的长度,数组空间一旦确定了大小不能…...
【蓝桥杯备战】Day 1
1.基础题目 LCR 018.验证回文串 给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。 本题中,将空字符串定义为有效的 回文串 。 示例 1: 输入: s "A man, a plan, a canal: Panama…...
电子应用设计方案-51:智能镜子系统方案设计
智能镜子系统方案设计 一、引言 智能镜子作为一种新兴的智能家居设备,将传统镜子与现代科技相结合,为用户提供了丰富的功能和便捷的体验。本方案旨在设计一款功能强大、用户友好、外观美观的智能镜子系统。 二、系统概述 1. 系统目标 - 提供清晰的镜面…...
[2015~2024]SmartMediaKit音视频直播技术演进之路
技术背景 2015年,因应急指挥项目需求,我们实现了RTMP推送音视频采集推送(采集摄像头和麦克风数据)模块,在我们做好了RTMP推送模块后,苦于没有一个满足我们毫秒级延迟诉求的RTMP播放器,于是第一…...
图片添加水印的实验原理,实验代码,实验现象
一、图片添加水印的实验原理 1. 选择水印类型 可见水印:这些水印可以直接被肉眼看到,通常用于防止未经授权的使用。它们可以是文字、标志或图案等形式,并且放置在图像的显著位置。不可见水印:这类水印不容易被察觉,但…...
Python Web 开发案例解析
一、Flask 基础应用案例 (一)项目搭建与初始化 环境准备 安装 Python 解释器,确保版本符合 Flask 要求,如 Python 3.6 及以上。使用pip安装 Flask 库,命令为pip install flask。可以创建虚拟环境,如python…...
JPG 转 PDF:免费好用的在线图片转 PDF 工具
JPG 转 PDF:免费好用的在线图片转 PDF 工具 在日常工作和生活中,我们经常需要将图片转换为 PDF 格式。无论是制作电子文档、准备演示材料,还是整理照片集,将图片转换为 PDF 都是一个常见的需求。今天为大家介绍一款完全免费、无需…...
代码随想录44天
1143.最长公共子序列 class Solution:def longestCommonSubsequence(self, s: str, t: str) -> int:n, m len(s), len(t)cache # 缓存装饰器,避免重复计算 dfs 的结果(记忆化)def dfs(i: int, j: int) -> int:if i < 0 or j <…...
C语言-详细解答-重组字符串并16进制转10进制
1.题目要求 2.代码实现 #include <stdio.h> #include <ctype.h> #include <string.h>int hexToDec(char hex[]) {int len strlen(hex);int base 1;int dec 0;for (int i len - 1; i > 0; i--) {if (isdigit(hex[i])) {dec (hex[i] - 0) * base;} e…...
scala列表
1 不可变 List 说明 (1)List 默认为不可变集合 (2)创建一个 List(数据有顺序,可重复) (3)遍历 List (4)List 增加数据 (5&#…...
医疗急救技能大赛理论题库
医疗急救技能大赛理论题库 题型包括:A1 型题 400题,A2 型题40题,A3/A4 型40 题, B 型题 80 题 ,X 型题 160 题,判断题 80 题。 一、A1 型题:共计400 题 (即最佳回答题,它由一个叙…...
深入浅出WebRTC—ULPFEC
FEC 通过在发送端添加额外的冗余信息,使接收端即使在部分数据包丢失的情况下也能恢复原始数据,从而减轻网络丢包的影响。在 WebRTC 中,FEC 主要有两种实现方式:ULPFEC 和 FlexFEC,FlexFEC 是 ULPFEC 的扩展和升级&…...
SQL 在线格式化 - 加菲工具
SQL 在线格式化 打开网站 加菲工具 选择“SQL 在线格式化” 或者直接访问 https://www.orcc.online/tools/sql 输入sql,点击上方的格式化按钮即可 输入框得到格式化后的sql结果...
到达率的变化动态调整服务器的服务率,实现负载均衡,提高资源利用效率
中心可以根据任务到达率的变化动态调整服务器的服务率,实现负载均衡,提高资源利用效率 服务率和到达率 中心可以根据任务到达率的变化动态调整服务器的服务率,实现负载均衡,提高资源利用效率服务率(Service Rate)到达率(Arrival Rate)控制参数实现负载均衡的方法在云计…...
【Golang】Go语言编程思想(六):Channel,第四节,Select
使用 Select 如果此时我们有多个 channel,我们想从多个 channel 接收数据,谁来的快先输出谁,此时应该怎么做呢?答案是使用 select: package mainimport "fmt"func main() {var c1, c2 chan int // c1 and …...
认证插件介绍
本文档是针对 UOS 登录器插件给出开发指南,目的是为了让开发人员了解如何在 UOS 登录器上增加一种自定义认证方式,对插件接口做了详细说明以及实战练习。 文章目录 一、认证插件可以做什么?二、认证流程三、术语说明四、安全性五、可靠性六、…...
MindSearch深度解析实践
1. 课程内容 1.1 MindSearch 简介 MindSearch 是一个开源的 AI 搜索引擎框架,具有与 Perplexity.ai Pro 相同的性能。我们可以轻松部署它来构建自己的专属搜索引擎,可以基于闭源的LLM(如GPT、Claude系列),也可以使用…...
[oeasy]python052_[系统开发语言为什么默认是c语言
[系统开发语言为什么默认是c语言 [趣味拓展]c语言发祥史_c是如何成为第一系统语言的 上次我们了解了 标识符 要求 首字符 为 字母和下划线 后面字符 为 字母和下划线 外加 数字 添加图片注释,不超过 140 字(可选) 使用isidentifier函数 可…...
【java常用算法和应用场景】
java常用算法和应用场景 Java中常用的算法涵盖多个领域,包括排序算法、查找算法、字符串匹配算法、图论算法、动态规划算法、贪心算法、分治算法等。以下是Java中一些常用算法及其应用场景和示例代码: 一、排序算法 排序算法是计算机科学中的一种基本…...
D96【python 接口自动化学习】- pytest进阶之fixture用法
day96 pytest的fixture详解(三) 学习日期:20241211 学习目标:pytest基础用法 -- pytest的fixture详解(三) 学习笔记: fixture(scop"class") (scop"class") 每一个类调…...
知从科技总经理受邀参加上海临港新片区商会“湖畔TECS”技术分享沙龙(第五期)
11月26日,上海知从科技有限公司创始人陈荣波先生受邀出席临港新片区商会 “湖畔TECS”技术分享沙龙(第五期)活动,并在活动上为参会嘉宾们做了主题分享。本次活动由临港新片区商会主办,智能网联汽车创新联盟协办&#x…...
scala的泛型应用场景
用代码表示泛型类://泛型:类型参数化 //Pair约定一对数据 class Pair[T](var x:T,var y:T) //class 类名(成员名:数据类型)--->class 类名[泛型名](成员名:泛型名)/.参考代码&…...
三种策略改进的沙猫群优化算法(MSCSO)
三种策略改进的沙猫群优化算法(MSCSO) 目录 三种策略改进的沙猫群优化算法(MSCSO)效果一览基本介绍程序设计参考资料效果一览 基本介绍 改进点: 三角形游走策略Levy飞行游走策略透镜成像反向学习SCSO是 2022年提出的元启发式优化算法,该算法灵感来源于沙猫的捕食行为,沙猫群…...
Google Cloud Database Option(数据库选项说明)
关系数据库 在关系数据库中,信息存储在表、行和列中,这通常最适合结构化数据。因此,它们用于数据结构不经常更改的应用程序。与大多数关系数据库交互时使用 SQL(结构化查询语言)。它们为数据提供 ACID 一致性模式&am…...
java抽奖系统登录下(四)
6.4 关于登录 最简单的登录: 1、web登录页填写登录信息,前端发送登录信息到后端; 2、后端接受登录信息,并校验。校验成功,返回成功结果。 这种登录会出现一个问题,用户1成功登录之后,获取到后台…...
Linux入门攻坚——41、Linux集群系统入门-lvs(2)
lvs-dr:GATEWAY Director只负责请求报文,响应报文不经过Director,直接由RS返回给Client。 lvs-dr的报文路线如上图,基本思路就是报文不会回送Director,第①种情况是VIP、DIP、RIP位于同一个网段,这样&…...
Android Freezer
Freezer原理 Android按照优先级将一般的APP从高到低分为: 前台进程 --> 可感知进程–> 服务进程 --> Cached进程。 Freezer通过冻住cached进程,来迫使这些进程让出CPU,以达到优化系统资源使用的目的。 Cached进程是怎么判定的呢? 由于andro…...
GeeCache-单体并发缓存
实现LRU中value接口的缓存类 使用互斥锁封装LRU缓存类,实现并发访问 实现Group组,用名称对缓存分类 Getter为缓存击穿时调用的回调函数 若缓存击穿则调用回调函数,并把读取到的值加载到缓存中...
ctfshow-web 151-170-文件上传
151. 我们首先想到就是上传一句话木马。但是看源代码限制了png。 (1)改前端代码。 这里是前端限制了上传文件类型,那我们就改一下就好了嘛,改成php。 这里直接修改不行,给大家推荐一篇简短文章,大家就会了(…...
汽车车牌标记支持YOLO,COCO,VOC三种格式标记,4000张图片的数据集
本数据集支持YOLO,COCO,VOC三种格式标记汽车车牌,无论是新能源汽车还是油车都能识别标记,该数据集一共包含4000张图片 数据集分割 4000总图像数 训练组 70% 2800图片 有效集 20% 800图片 测…...
解决VSCode无法识别相对路径的问题
前言: 近日在学习python文件操作时,发现使用VSCode作为编辑器时,文件的相对路径会出问题,报错“指定路径下找不到文件”,无法找到想要的文件。 知识点①:不同操作系统所使用的路径斜杠不同:Lin…...
OCR 技术在验证码识别中的应用
OCR 技术在验证码识别中的应用 一、验证码识别的背景与挑战二、OCR 技术简介三、验证码识别的环境搭建四、使用 OCR 进行验证码识别的方法五、DdddOcr 子项在验证码识别中的应用六、验证码识别的应用场景与注意事项七、总结 在当今数字化时代,验证码作为一种安全验证…...
恶补英语初级第21天,《讨论天气变化》
对话 What’s the weather like in spring? It’s often windy in March. It’s always warm in April and May, but it rains sometimes. What’s it like in summer? It’s always hot in June, July and August. The sun shines every day. Is it cold or warm in autumn?…...
牛客网刷题SQL--高级查询
目录 SQL16--查找GPA最高值 描述 示例1 答案 其他方法: SQL17--计算男生人数以及平均GPA 描述 示例1 答案 SQL18--分组计算练习题 描述 示例1 答案 SQL19--分组过滤练习题 描述 示例1 答案 SQL20--分组排序练习题 描述 示例1 答案 SQL16--查找GP…...
用ffmpeg将MP4视频转换为m3u8格式
原文网址:用ffmpeg将MP4视频转换为m3u8格式_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍如何使用ffmpeg将MP4视频转换为m3u8格式。 什么是m3u8 M3U8视频格式是一种M3U,只是它的编码格式是UTF-8格式。M3U用Latin-1字符集编码。M3U8格式特点是带有…...
【Qt】qt基础
目录 一、使用Qt Creator创建qt项目 二、项目文件解析 三、Qt中创建图形化界面的程序的两种方法 四、对象树 一、使用Qt Creator创建qt项目 1.选择项目模板 选中第一类模板Application(Qt应用程序,包含普通窗体程序和QtQuick程序), 然后选中右侧的第…...
VLC还是SmartPlayer?Windows平台RTSP播放器低延迟探讨
技术背景 好多开发者在用过大牛直播SDK的RTSP播放器后,都希望我们也分享下,如何在Windows平台实现低延迟的RTSP播放?低延迟的RTSP播放器,说起来容易做起来难,下面,我们从以下维度做个探讨: 播…...
极验决策引擎如何凭借独特优势,弯道超车传统风控?
前言 市场上的规则决策引擎产品众多,但大多局限于IP、设备、账号等层面,提供的是现成的风控标签和规则。然而,真正的风控,需要的不仅仅是标签和规则。 极验的业务规则决策引擎与众不同,这款决策引擎以界面流程编排为…...
Spring Boot集成Knife4j文档工具
Knife4j 搭建 Knife4j环境的的搭建和Swagger一样都比较简单,只需要极简的配置即可。 maven依赖 我使用的是较高版本的基于openapi规范的依赖包,OpenAPI2(Swagger)规范是Knife4j之前一直提供支持的版本,底层依赖框架为Springfox。 此次在4…...
html|本地实现浏览器m3u8播放器,告别网络视频卡顿
前言 网络上经常是以m3u8文件传输视频流的 ,但是有时网络慢往往导致视频播放卡顿。于是我在想能不能先下载然后再播放呢?于是尝试下载然后实现本地播放m3u8视频。 正文 1.找到网络视频流的m3u8连接 一般在浏览器按F12就可以看到有请求视频流的连接。 …...
vue3监听横向滚动条的位置;鼠标滚轮滑动控制滚动条滚动;监听滚动条到顶端
1.横向取值scrollLeft 竖向取值scrollTop 2.可以监听到最左最右侧 3.鼠标滚轮滑动控制滚动条滚动 效果 <template><div><div class"scrollable" ref"scrollableRef"><!-- 内容 --><div style"width: 2000px; height: 100…...
JSON
文章目录 一、概念1.json官网2.json的概念3.序列化方案:xml、json 二、json的数据类型1.json的键:必须是带双引号的字符串2.json的值:6种数据类型(1)对象 { }(2)数组 [ ] 三、Python中的json1.序列化:Python对象 转 json2.反序列化…...
前端常用的方法
时间处理 moment时间处理函数 // 时间日期相关常用的方法变量 import moment from moment;// 获取当前时间 moment export const nowDateMoment moment(new Date()); export const nowDateY moment(new Date()).format(YYYY); export const nowDateM moment(new Date()).f…...
JavaScript 对话框的魔法与艺术
在Web开发的世界里,JavaScript 对话框是用户与网页互动的重要桥梁。它们不仅能够提供即时反馈,还能收集用户的输入信息,从而增强用户体验。本文将深入探讨JavaScript对话框的各种类型、用法及其背后的原理,并通过丰富的实例展示如…...
java+springboot+mysql私人会所管理系统
项目介绍: 使用javaspringbootmysql开发的私人会所管理系统,系统包含管理员、技师、用户角色,功能如下: 管理员:用户管理;服务项目;技师管理;房间管理;预约管理&#x…...
Scrapy 爬虫框架全解析
一、Scrapy 框架概述 基本定义 Scrapy 是一个用 Python 编写的开源网络爬虫框架。它旨在快速、高效地抓取网页数据,可处理大规模的数据抓取任务。基于 Twisted 异步网络库构建,能够并发地处理多个请求,大大提高了数据抓取的速度。遵循 “请求…...
Hive3.X——异常处理Could not create ServerSocket on address 0.0.0.0/0.0.0.0:10000
Hive3.X——异常处理Could not create ServerSocket on address 0.0.0.0/0.0.0.0:10000 01 前言 大数据系列,学到了Hive,搭建环境的时候,因为使用的是本机WSL2(别问为啥不用VMware,问就是条件有限,而且WS…...
【跨库查询、多库查询】.NET开源 ORM 框架 SqlSugar 系列
文章目录 一、跨库方式1:跨库导航二、手动跨库查询三、同服务器:自动查询跨库查询3.1 Mysql和SqlServer自动3.2 自动: PgSql跨Scheme查询3.3 其他库同服务器 四、跨服务器:自动跨库查询4.1 配置SqlServer dblink4.2 配置 Oracle dblink4.3 配…...
【JAVA】Java项目实战—Java 数据库应用项目:学生信息管理系统
本项目将实现一个简单的学生信息管理系统,功能包括学生信息的录入、查询、修改和删除。通过本项目,读者将深入理解Java与数据库交互的基本原理,掌握JDBC(Java Database Connectivity)技术,以及如何构建一个…...
中电金信携手中远海科,共启贸易金融数智新篇章
在数智化转型成为驱动经济社会高质量发展的新引擎背景下,“数智方案”栏目聚焦金融等国计民生重点行业场景,依托中电金信“源启筑基咨询引领应用重构”的产品及服务体系,输出市场洞察和行业解决方案、应用案例,旨在全面推动行业IT…...