深度探索 C 语言:指针与内存管理的精妙艺术
C 语言作为一门历史悠久且功能强大的编程语言,以其高效的性能和灵活的底层控制能力,在计算机科学领域占据着举足轻重的地位。
指针和内存管理是 C 语言的核心特性,也是其最具挑战性和魅力的部分。深入理解指针与内存管理,不仅能够帮助我们编写出高效、健壮的代码,还能让我们更好地掌控程序的运行过程。
1 指针的基本概念
1.1 指针的定义与初始化
指针是一个变量,其值为另一个变量的内存地址。在 C 语言中,通过 * 运算符来声明指针变量。例如:
#include <stdio.h>int main() {int num = 10;int *p = # // 定义一个指向 int 类型变量的指针 p,并将其初始化为 num 的地址printf("num 的值为: %d\n", num);printf("num 的地址为: %p\n", &num);printf("p 指向的地址为: %p\n", p);printf("p 指向的值为: %d\n", *p); // 使用 *p 访问指针 p 所指向的变量的值return 0;
}
在上述代码中,我们首先定义了一个整型变量 num,然后定义了一个指向整型变量的指针 p,并将 num 的地址赋给 p。通过 *p 可以访问 p 所指向的变量的值。
1.2 指针的运算
指针可以进行一些基本的运算,如加减运算。指针的加减运算是根据指针所指向的数据类型的大小进行的。例如:
#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5};int *p = arr; // 数组名 arr 可以看作是指向数组第一个元素的指针printf("数组第一个元素的值为: %d\n", *p);p++; // 指针 p 向后移动一个元素的位置printf("数组第二个元素的值为: %d\n", *p);return 0;
}
在这个例子中,我们定义了一个整型数组 arr 和一个指向该数组的指针 p。通过 p++ 操作,指针 p 向后移动了一个元素的位置,从而指向了数组的第二个元素。
2 动态内存分配
2.1 malloc 函数
在 C 语言中,我们可以使用 malloc 函数动态分配内存。malloc 函数返回一个指向分配内存的指针,如果分配失败则返回 NULL。例如:
#include <stdio.h>
#include <stdlib.h>int main() {int *p = (int *)malloc(sizeof(int) * 10); // 动态分配 10 个 int 类型大小的内存if (p == NULL) {printf("内存分配失败\n");return 1;}for (int i = 0; i < 10; i++) {p[i] = i + 1;printf("p[%d] = %d\n", i, p[i]);}free(p); // 释放动态分配的内存return 0;
}
在上述代码中,我们使用 malloc 函数动态分配了 10 个 int 类型大小的内存,并将其地址赋给指针 p。然后通过循环为数组元素赋值并打印。最后,使用 free 函数释放了动态分配的内存。
2.2 calloc 函数
calloc 函数与 malloc 函数类似,但它会将分配的内存初始化为零。calloc 函数的参数为元素的数量和每个元素的大小。例如:
#include <stdio.h>
#include <stdlib.h>int main() {int *p = (int *)calloc(10, sizeof(int)); // 动态分配 10 个 int 类型大小的内存,并初始化为零if (p == NULL) {printf("内存分配失败\n");return 1;}for (int i = 0; i < 10; i++) {printf("p[%d] = %d\n", i, p[i]); // 打印数组元素,初始值都为 0}free(p); // 释放动态分配的内存return 0;
}
2.3 realloc 函数
realloc 函数用于重新分配动态内存的大小。它可以将已分配的内存扩大或缩小。例如:
#include <stdio.h>
#include <stdlib.h>int main() {int *p = (int *)malloc(sizeof(int) * 5); // 动态分配 5 个 int 类型大小的内存if (p == NULL) {printf("内存分配失败\n");return 1;}for (int i = 0; i < 5; i++) {p[i] = i + 1;printf("p[%d] = %d\n", i, p[i]);}p = (int *)realloc(p, sizeof(int) * 10); // 重新分配内存,将大小扩大到 10 个 int 类型if (p == NULL) {printf("内存重新分配失败\n");return 1;}for (int i = 5; i < 10; i++) {p[i] = i + 1;printf("p[%d] = %d\n", i, p[i]);}free(p); // 释放动态分配的内存return 0;
}
在这个例子中,我们首先动态分配了 5 个 int 类型大小的内存,并为前 5 个元素赋值。然后使用 realloc 函数将内存大小扩大到 10 个 int 类型,并为新分配的元素赋值。
3 指针与数组的关系
3.1 数组名作为指针
在 C 语言中,数组名可以看作是指向数组第一个元素的指针。例如:
#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5};int *p = arr; // 数组名 arr 可以看作是指向数组第一个元素的指针for (int i = 0; i < 5; i++) {printf("arr[%d] = %d, *(p + %d) = %d\n", i, arr[i], i, *(p + i));}return 0;
}
在上述代码中,我们通过数组名 arr 和指针 p 都可以访问数组的元素。
3.2 二维数组与指针
二维数组可以看作是一维数组的数组。二维数组名是指向一维数组的指针。例如:
#include <stdio.h>int main() {int arr[3][4] = {{1, 2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}};printf("arr[0][0] = %d, *(*(arr + 0) + 0) = %d\n", arr[0][0], *(*(arr + 0) + 0));printf("arr[1][2] = %d, *(*(arr + 1) + 2) = %d\n", arr[1][2], *(*(arr + 1) + 2));return 0;
}
在这个例子中,我们使用指针的方式访问了二维数组的元素。
4 指针与函数
4.1 指针作为函数参数
指针可以作为函数的参数,这样可以在函数内部修改外部变量的值。例如:
#include <stdio.h>void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}int main() {int x = 10, y = 20;printf("交换前: x = %d, y = %d\n", x, y);swap(&x, &y);printf("交换后: x = %d, y = %d\n", x, y);return 0;
}
在上述代码中,我们定义了一个 swap 函数,通过指针参数交换了两个变量的值。
4.2 返回指针的函数
函数可以返回指针,这样可以返回一个动态分配的内存地址或数组的地址。例如:
#include <stdio.h>
#include <stdlib.h>int* createArray(int size) {int *arr = (int *)malloc(sizeof(int) * size);if (arr == NULL) {return NULL;}for (int i = 0; i < size; i++) {arr[i] = i + 1;}return arr;
}int main() {int size = 5;int *arr = createArray(size);if (arr == NULL) {printf("内存分配失败\n");return 1;}for (int i = 0; i < size; i++) {printf("arr[%d] = %d\n", i, arr[i]);}free(arr); // 释放动态分配的内存return 0;
}
在这个例子中,createArray 函数返回一个动态分配的数组的地址。
5 常见的指针与内存管理错误
5.1 野指针
野指针是指指向未知内存地址的指针。使用野指针可能会导致程序崩溃或数据损坏。例如:
#include <stdio.h>int main() {int *p; // 未初始化的指针,是野指针*p = 10; // 使用野指针,可能导致程序崩溃return 0;
}
为了避免野指针,应该在定义指针时将其初始化为 NULL,在使用指针之前检查其是否为 NULL。
5.2 内存泄漏
内存泄漏是指动态分配的内存没有被释放,导致内存资源的浪费。例如:
#include <stdio.h>
#include <stdlib.h>void allocateMemory() {int *p = (int *)malloc(sizeof(int) * 10);// 没有释放动态分配的内存,导致内存泄漏
}int main() {allocateMemory();return 0;
}
为了避免内存泄漏,应该在不再需要使用动态分配的内存时,使用 free 函数释放内存。
5.3 重复释放内存
重复释放内存是指对同一块动态分配的内存调用多次 free 函数,这会导致程序崩溃。例如:
#include <stdio.h>
#include <stdlib.h>int main() {int *p = (int *)malloc(sizeof(int) * 10);free(p);free(p); // 重复释放内存,导致程序崩溃return 0;
}
为了避免重复释放内存,应该在释放内存后将指针置为 NULL。
指针和内存管理是 C 语言的核心特性,也是其强大之处。通过深入理解指针与内存管理的原理和方法,我们可以编写出高效、健壮的 C 语言程序。同时,我们也需要注意避免常见的指针与内存管理错误,如野指针、内存泄漏和重复释放内存等。希望本文通过丰富的代码示例,能够帮助读者更好地掌握 C 语言中的指针与内存管理。
在实际编程中,我们应该养成良好的编程习惯,合理使用指针和动态内存分配,确保程序的稳定性和性能。不断地实践和学习,才能在 C 语言的世界里游刃有余。
相关文章:
深度探索 C 语言:指针与内存管理的精妙艺术
C 语言作为一门历史悠久且功能强大的编程语言,以其高效的性能和灵活的底层控制能力,在计算机科学领域占据着举足轻重的地位。 指针和内存管理是 C 语言的核心特性,也是其最具挑战性和魅力的部分。深入理解指针与内存管理,不仅能够…...
【C++】深拷贝与浅拷贝
重开也不是不可能 ~.~ 浅拷贝 #include <iostream> #include <cstring>class ShallowCopyExample { public:int m_nValue;int* m_pData;// 构造函数,初始化指针成员ShallowCopyExample(int value) : m_nValue(value) {m_pData new int(0);*m_pData va…...
【3】k8s集群管理系列--包应用管理器helm之chart资源打包并推送到harbor镜像仓库
一、chart资源打包 helm package ./web-chart # 当前目录会生成一个tgz的压缩文件二、安装help push插件(用于推送前面打包的文件,到镜像仓库) .1 下载help-push二进制文件 wget https://github.com/chartmuseum/helm-push/releases/down…...
React与Vue:选择哪个框架入门?
React与Vue:选择哪个框架入门? 作为前端开发者,我在React和Vue两个框架间切换多次,常被新手问到应该从哪个入手。不同于网上那些详尽的技术比较,这里我想从实用角度给你一个简明对比。 两大框架核心差异 特性ReactV…...
pycharm已有python3.7,如何新增Run Configurations中的Python interpreter为python 3.9
在 PyCharm 中,如果你已经安装了 Python 3.9,并且希望在 Run Configurations 中新增一个 Python 3.9 的解释器,可以按照以下步骤操作: 步骤 1:打开 PyCharm 设置 点击 PyCharm 左上角的 File 菜单。选择 Settings&am…...
STL之迭代器(iterator)
迭代器的基本概念 迭代器(iterator)模式又称为游标(Cursor)模式,用于提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。或者这样说可能更容易理解:Iterator模式是运用于聚合对象的一种模式,通过运用该模式&#…...
Mysql5.7配置文件
Mysql5.7配置文件 初始化数据库之前修改my.cnf----配置持久化键(persistence key) 初始化数据库之前修改my.cnf----配置持久化键(persistence key) 使用utf8mb4而不是utf8: https://blog.csdn.net/omaidb/article/details/106481406 https://blog.csdn.net/fdipzo…...
HarmonyOS-ArkUI V2装饰器: @Provider和@Consumer装饰器:跨组件层级双向同步
作用 我们在之前学习的那些控件中,各有特点,也各有缺陷,至今没有痛痛快快的出现过真正能跨组件的双向绑定的装饰器。 比如 @Local装饰器,不能跨组件@Param装饰器呢,能跨组件传递,但是仅仅就是下一层组件接收参数。另外,它是单向传递,不可被重新赋值。如果您非要改值则…...
【HarmonyOS 5】敏感信息本地存储详解
【HarmonyOS 5】敏感信息本地存储详解 前言 鸿蒙其实自身已经通过多层次的安全机制,确保用户敏感信息本地存储安全。不过再此基础上,用户敏感信息一般三方应用还需要再进行加密存储。 本文章会从鸿蒙自身的安全机制进行展开,最后再说明本地…...
0x03.Redis 通常应用于哪些场景?
回答重点 1)缓存(Cache): Redis 最常用的场景是作为缓存层,以减少数据库的负载,提高数据读取速度。例如,常用的用户会话数据和页面渲染结果可以存储在 Redis 中。2)分布式锁(Distributed Lock): Redis 可以用作分布式锁的实现,确保在分布式系统中资源的安全访问,避免…...
Keil创建自定义的STM32标准库工程
注:以下工程创建将以STM32F103ZET6为例 1 下载需要的资料包 1.1 下载 Keil 的 STM32F103 芯片支持包 1.1.1 手动下载安装包 Keil官网:https://www.keil.com/ (1)进入官网,点击 Download。 (2…...
React(1)基础入门
React(1)基础入门 Author: Once Day Date: 2025年4月10日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: FullStack开发_Once-Day的博客-CSDN博客 …...
Mysql8配置文件
Mysql8配置文件 修改my.cnf----配置持久化键(persistence key)配置表名不区分大小写 修改my.cnf----配置持久化键(persistence key) MySQL8初始化数据库之前配置好这些变量值,初始化数据库之后可能无法修改这个值。 # 服务端配置 [mysqld] ######## 数据目录和基…...
c/c++ 使用libgeotiff读取全球高程数据ETOPO
#include <geotiff.h> #include <geotiffio.h> #include <tiffio.h> #include <iostream> #include <xtiffio.h> void MyTIFFErrorHandler(const char* module, const char* fmt, va_list args) {// 格式化错误消息char buffer[1024];vsnprintf(…...
Spring Boot集成Nacos
1. 添加依赖 在pom.xml文件中添加Nacos相关依赖。根据Spring Boot版本选择合适的依赖版本: Spring Boot 3.2.x版本 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artif…...
CAP理论 与 BASE理论
一、分布式系统存在的问题 1.分布式系统 20世纪90年代,随着互联网应用的快速扩张,传统单机系统难以支撑高并发、跨地域的数据处理需求。分布式系统(Distributed System) 逐渐成为主流架构,分布式系统是由多台计算机&…...
C++(21)—类和对象(下) ⑥匿名对象
文章目录 一、匿名对象的定义与基本特性二、匿名对象与有名对象的对比1. 有名对象2. 匿名对象 三、匿名对象的构造与析构时机1. 构造与析构规则2. 示例分析 四、匿名对象的适用场景1. 临时调用对象方法2. 作为函数参数 五、总结 一、匿名对象的定义与基本特性 匿名对象&#x…...
Go环境变量配置
Go环境变量配置 一、下载 进入The Go Programming Language 点击下载对应操作系统的 安装成功界面如下图,默认安装到: usr/local/go/ 安装完成之后,在终端运行 go version,如果显示类似下面的信息,表明安装成功(备注:darwin(其实…...
AI推理强,思维模型也有功劳【58】二八定律思维
giszz的理解:二八定律,我们说的和听的都比较多。20%的关键,是事物本质,做人不要贪心,也不要胡子眉毛一把抓。当然,也不要轻视那80%。 一、定义 二八定律思维模型,也被称为帕累托法则࿰…...
文件上传靶场
文件上传靶场 项目结构 upload-lab/ ├── Dockerfile └── www├── index.php└── upload└── flag.txt执行命令流程(逐行执行) 创建目录结构 # 创建目录结构 mkdir upload-lab;cd upload-lab mkdir -p www/upload# 创建flag文件 echo &qu…...
RV1106 OCR 识别算法
一 题记 目标是在某款 RV1106 低算力小板下跑通OCR文字识别算法,做个简单的应用,RK 官方模型库rk_model_zoo 有PP-OCR 的例子,但在 rv1106 上尚未支持。于是便打算折腾一吧。 二 方案甄选 参考国外某大佬的比较: 对比了几种方案…...
Linux实现翻译以及群通信功能
1.翻译功能实现 UdpServer.hpp文件 构造函数 接收一个端口号和一个回调函数,回调函数是传入一个执行方法,比如翻译方法。 UdpServer(uint16_t port,func_t func):_sockfd(defaultfd),_port(port),_isrunning(false),_func(func){}Init函数 首先创建了…...
[MRCTF2020]ezpop wp
本题考点:php反序列化的pop链 首先来了解一下pop链是什么,它类似于多米诺骨牌一环套一环,要调用这个成员方法然后去找能调用这个方法的魔术方法,最后一环接一环,完成一个链子,最终形成payload。 那么来了解一下这些魔术方法 __construct() //类的构造函数࿰…...
机器学习入门之Sklearn基本操作
、 Sklearn全称:Scipy-toolkit Learn是 一个基于scipy实现的的开源机器学习库。它提供了大量的算法和工具,用于数据挖掘和数据分析,包括分类、回归、聚类等多种任务。本文我将带你了解并入门Sklearn在机器学习中的基本用法。 获取方式 pip install sc…...
(二十二)安卓开发中的数据存储之SQLite简单使用
在Android开发中,SQLite是一种非常常用的数据库存储方式。它轻量、简单,非常适合移动设备上的数据管理。本文将通过通俗易懂的语言,结合代码示例和具体场景,详细讲解SQLite在Android中的使用。 1. 什么是SQLite? SQLite是一个开…...
docker compose搭建博客wordpress
一、前言 docker安装等入门知识见我之前的这篇文章 https://blog.csdn.net/m0_73118788/article/details/146986119?fromshareblogdetail&sharetypeblogdetail&sharerId146986119&sharereferPC&sharesourcem0_73118788&sharefromfrom_link 1.1 docker co…...
信息学奥赛一本通 1498:Roadblocks | 洛谷 P2865 [USACO06NOV] Roadblocks G
【题目链接】 ybt 1498:Roadblocks 洛谷 P2865 [USACO06NOV] Roadblocks G 【题目考点】 1. 图论:严格次短路径 严格次短路的路径长度必须大于最短路的路径长度。 非严格次短路的路径长度大于等于最短路的路径长度。 【解题思路】 每个交叉路口是一…...
学习笔记—C++—类和对象(三)
目录 类和对象 再探构造函数 类型转换 隐式类型转换 显式类型转换 C语言风格类型转换 C风格类型转换 static_cast dynamic_cast const_cast reinterpret_cast static成员 友元 友元函数 友元类 友元成员函数 内部类 匿名对象 匿名对象的使用场景:…...
句句翻译。
对这些单词整理,格式为:“overall /əʊvərɔːl/ adj.全面的,综合的,总体的adv.全部,总 计,一般来说,大致上,总体上n.外套,罩衣,工装连衣裤,工装 服 ” 4,4 A review published in January in Experimental Dermatology found that ceramide made sk…...
LeetCode 2999.统计强大整数的数目:上下界数位DP
【LetMeFly】2999.统计强大整数的数目:上下界数位DP 力扣题目链接:https://leetcode.cn/problems/count-the-number-of-powerful-integers/ 给你三个整数 start ,finish 和 limit 。同时给你一个下标从 0 开始的字符串 s ,表示一…...
具身导航中的视觉语言注意力蒸馏!Vi-LAD:实现动态环境中的社会意识机器人导航
作者:Mohamed Elnoor 1 ^{1} 1, Kasun Weerakoon 1 ^{1} 1, Gershom Seneviratne 1 ^{1} 1, Jing Liang 2 ^{2} 2, Vignesh Rajagopal 3 ^{3} 3, and Dinesh Manocha 1 , 2 ^{1,2} 1,2单位: 1 ^{1} 1马里兰大学帕克分校电气与计算机工程系, 2…...
FreeRTOS入门与工程实践-基于STM32F103(一)(单片机程序设计模式,FreeRTOS源码概述,内存管理,任务管理,同步互斥与通信,队列,信号量)
裸机程序设计模式 裸机程序的设计模式可以分为:轮询、前后台、定时器驱动、基于状态机。前面三种方法都无法解决一个问题:假设有A、B两个都很耗时的函数,无法降低它们相互之间的影响。第4种方法可以解决这个问题,但是实践起来有难…...
算法思想之位运算(二)
欢迎拜访:雾里看山-CSDN博客 本篇主题:算法思想之位运算(二) 发布时间:2025.4.13 隶属专栏:算法 目录 滑动窗口算法介绍六大基础位运算符常用模板总结 例题判定字符是否唯一题目链接题目描述算法思路代码实现 汉明距离题目链接题目…...
软考笔记day04
寻址方式 CISC RISC 流水线技术 存储系统 1、层次化存储系统 2、Cache 3、主存编址计算 输入输出技术 I/O 总线...
本地电脑如何连接windows云服务器
进行远程连接需要几个数据:用户名、密码、公网IP 打开本地cmd,输入命令mstsc打开远程连接面板, 在计算机输入框中输入云服务器的IP地址 点击“选项”展开,点击“本地资源”,然后点击“详细信息” 用户名通常为admin…...
Linux内核常见的调度策略
在 Linux 内核中,调度策略决定了任务如何被分配 CPU 时间以及任务之间的优先级关系。以下是五种常见的调度策略:STOP、DL(Deadline)、RT(Real-Time)、CFS(Completely Fair Scheduler)…...
【Linux】进程优先级、进程切换、进程调度
Linux 1.进程优先级1.基本概念2.查看进程1.UID2.PRI、NI3.修改优先级(PRI) 3.竞争、独立、并行、并发 2.进程切换3.进程调度1.活动队列2.过期队列3.active、expired指针 1.进程优先级 1.基本概念 优先级:进程得到 CPU 资源分配的先后顺序。优…...
HCIP第十二天
LSA --- 链路状态通告 链路状态类型,链路状态ID,通告路由器 --- LSA的三元组 --- 可以唯一的标识出一条LSA Type --- OSPFv2中,常见的需要掌握LSA有6种 LS ID --- LSA的名字 --- 因为每一种LSA LS ID的生成方式都不相同,所以&am…...
Magnet Pro Macbook窗口分屏管理软件【提高效率工具】
Magnet Pro Macbook窗口分屏管理软件【提高效率工具】 一、介绍 Magnet Pro for Mac,是一款功能强大的窗口分屏管理软件,具有多种布局模式、窗口布局功能和其他工具,可以帮助您高效地进行多任务处理和管理工作。 拖动窗口到边缘,…...
控制单元(Control Unit, CU)
一、控制单元的定义与核心作用 控制单元 是 CPU 的核心部件之一,负责 解析指令、生成控制信号 并 协调各硬件部件 的工作时序,确保指令按预定流程正确执行。 核心定位:计算机系统的“指挥中心”,通过控制总线与运算器、存储器、…...
JavaWeb 课堂笔记 —— 10 MySQL DML + DQL
本系列为笔者学习JavaWeb的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaWeb开发教程,实现javaweb企业开发全流程(涵盖SpringMyBatisSpringMVCSpringBoot等)》,章节分布参考视频教程,为同样学习…...
基于 LSTM 的多特征序列预测-SHAP可视化!
往期精彩内容: 单步预测-风速预测模型代码全家桶-CSDN博客 半天入门!锂电池剩余寿命预测(Python)-CSDN博客 超强预测模型:二次分解-组合预测-CSDN博客 VMD CEEMDAN 二次分解,BiLSTM-Attention预测模型…...
【C++】哈希扩展海量数据处理
目录 位图 位图面试题 C库中的位图bitset 位图优缺点 位图相关题目 布隆过滤器 布隆过滤器的介绍 布隆过滤器的应用 海量数据处理 位图 位图面试题 1.给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个整数是否在这40亿…...
考研数据结构精讲:数组与特殊矩阵的压缩存储技巧(包含真题及解析)
考研数据结构精讲:数组与特殊矩阵的压缩存储技巧 一、数组基础概念 1.1 数组的定义 数组是由相同数据类型的元素构成的有限序列,具有以下核心特性: 维度特性:支持一维到多维结构(常见二维数组)随机访问…...
【Android】ContentResolver的使用
在 Android 中,ContentResolver 是一个非常重要的类,它提供了与 ContentProvider 进行交互的方法。ContentProvider 是用于在不同应用程序之间共享数据的标准接口,而 ContentResolver 则是从客户端(如 Activity 或 Service&#x…...
Python 的 collections 模块
1. deque (双端队列) 定义 deque(读作 “deck”,即双端队列)是一个支持从两端高效添加和删除元素的数据结构。相比列表(list)在头部操作的 O(n) 时间复杂度,deque 的两端操作都是 O(1)。 用途 队列和栈…...
浏览器发起调用到服务器的全过程解析
在 Web 应用的交互过程中,从用户在浏览器输入 URL 发起请求,到最终获取服务器返回的内容,背后涉及多个复杂而有序的步骤。理解这一过程,对于深入掌握 Web 开发、优化应用性能以及排查网络问题都具有重要意义。下面将详细阐述浏览器…...
塑料瓶识别分割数据集labelme格式976张1类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):976 标注数量(json文件个数):976 标注类别数:1 标注类别名称:["Trash plastic"] 每个类别标注的框数…...
RuoYi-Vue升级为https访问-后端安装SSL证书(单台Linux服务器部署)
一、前言 当Nginx已经作为反向代理并成功配置了SSL证书时,前端客户端与Nginx的通信已经是加密的。但Nginx和后端服务之间的连接可能仍然存在明文传输的风险。 如果Nginx和后端服务位于同一台物理机器或者通过安全的内部网络(如私有VLAN或防火墙保护的内网)进行通信,则可以…...
【学习笔记】文件上传漏洞--中间件解析漏洞、编辑器安全
目录 一、IIS 二、Apache HTTP Server 三、Apache HTTPD 未知后缀解析漏洞 四、Apache HTTPD 换行解析漏洞 五、黑、白名单 六、nginx解析漏洞 七、编辑器漏洞 一、IIS 文件夹 正常:image/qq.jpg 执行:image.asp/qq.jpg qq.jpg就会被当做asp解…...