- 博客(87)
- 收藏
- 关注
原创 【C/C++】实现固定地址函数调用
本文介绍了在C++中通过固定函数地址实现直接调用的方法。首先说明DLL/SO中函数地址可能因ASLR而改变,通过VS设置可固定地址:在项目属性→链接器→高级中禁用随机基址。然后演示了具体操作步骤,包括获取函数地址、定义函数指针类型并通过地址成功调用函数的过程。该方法适用于需要稳定函数地址调用的场景,但需注意安全性与兼容性影响。
2025-06-07 18:52:53
460
原创 【力扣】数学之美:对角线与N皇后问题的完美结合
对角线解题的优势1、减少搜索空间通过主、副对角线的特性,可以快速判断某位置是否被斜线占用,无需逐一遍历棋盘,极大提高了算法效率。2、简单的映射关系使用简单的数学公式(y - x 和 y + x)将二维棋盘的斜线问题转化为一维数组的访问问题,代码实现直观简洁。
2024-12-12 19:12:48
1573
原创 【Docker】详细教程:解决 Docker 无法登录与推送问题
自从 2023 年 5 月中旬以来,著名的 Docker 容器平台 hub.docker.com 因不明原因在国内无法正常访问。为了更好地使用 Docker 服务,阿里云提供了容器镜像服务,下面介绍如何使用阿里云容器镜像服务进行操作。通过阿里云容器镜像服务,可以快速解决国内访问 Docker Hub 速度慢甚至无法访问的问题,并支持镜像的上传与管理。此外,结合阿里云镜像服务,可以实现更高效的镜像管理。
2024-12-07 15:51:49
13140
4
原创 【Linux】揭秘Linux内核IPC资源管理
虽然所有IPC资源都使用 struct kern_ipc_perm 来管理权限和元数据,但如何区分不同类型的资源(例如共享内存、消息队列和信号量)则依赖于 mode 字段的不同值。无论是共享内存、消息队列还是信号量,它们都遵循相同的基本管理方式——通过 struct kern_ipc_perm 结构体来管理权限信息和相关的元数据。每个IPC资源都被存储在 struct ipc_id_ary 中,它是一个包含多个 kern_ipc_perm 结构体指针的数组。通过这种方式,内核可以高效地管理IPC资源。
2024-12-05 16:03:25
1085
2
原创 【Docker】从单体架构到容器编排架构的演进
对于不断发展的系统,如电商平台,应设计到能满足下一阶段用户量和性能指标要求的程度,并根据业务的增长不断的迭代升级架构,以支持更高的并发和更丰富的业务。数据库设计到这种结构时,已经可以称为分布式数据库,但是这只是一个逻辑的数据库整体,数据库里不同的组成部分是由不同的组件单独来实现的,如分库分表的管理和请求分发,由 Mycat 实现,SQL 的解析由单机的数据库实现,读写分离可能由网关和消息队列来实现,查询结果的汇总可能由数据库接口层来实现等等,这种架构其实是 MPP(大规模并行处理)架构的一类实现。
2024-12-04 16:00:51
1995
2
原创 【MySQL】库的操作
说明:当我们创建数据库没有指定字符集和校验规则时,系统使用默认字符集:utf8mb4,校验规则是:utf8_ general_ ciutf8mb4_0900_ai_ci。MySQL 提供了丰富的数据库管理功能,包括数据库的创建、删除、修改等操作。对数据库的操作就是对目录的操作。对应的数据库文件夹被删除,级联删除,里面的数据表全部被删。对数据库的修改主要指的是修改数据库的字符集,校验规则。可以看到,数据库对应的就是目录新建的目录。数据库编码集 数据库存储数据的规则。数据库内部看不到对应的数据库。
2024-12-04 15:29:57
1562
2
原创 【MySQL】Ubuntu下C++连接MySQL
连接 MySQL 数据库需要使用 MySQL 的客户端库,通过该库,可以在 C++ 程序中执行 SQL 查询、插入数据以及处理结果集。注意,在mysql5.7的时候,mysqlclient默认编码是latin1,如果插入中文就会乱码,所以链接成功数据库后,需要设置编码,mysql_set_character_set(my, “utf8”);可以看到,MYSQL_RES结构体里面包含了很多内容,我们要做的就是从里面获取出行信息,列信息,列名等我们需要的信息。mysql_init() 初始化mysql。
2024-12-04 15:06:44
2623
2
原创 【内网穿透】一文学会FRP的内网穿透实操
一些敏感操作会被误报,比如说读取内存du,调用/执行cmd脚本,修改dll文件,注入代码等等操作”而这款软件就是会调用/执行CMD脚本,并且会将本地端口映射到公网(内网穿透不就是干这个的嘛),所以部分杀毒软件会报毒。FRP(Fast Reverse Proxy)是一个开源的、高性能的反向代理应用,可以实现内网穿透,让外部设备能够访问内网中的资源。在家庭网络中的 Linux 机器上,部署 FRP 客户端(frpc),并配置将本地的 nginx 服务(端口 80)映射到云服务器的指定端口(如 8081)。
2024-11-30 08:45:43
3115
3
原创 【C/C++】库打开和关闭流的时机
最后stdin,stdout,stderr还是没有被关闭,只是数据被刷新掉了,这里就说明了为什么程序退出,C标准库会自动刷新缓冲区,那么stdin,stdout,stderr什么时候关闭呢。这个进程结束,OS回收这个进程的所有资源,就会把对应的文件关闭,进程不存在了,那么FILE自然就被回收了。在 C/C++ 程序中,标准输入、标准输出和标准错误流是通过预定义的文件流来管理的。_IO_flush_all() 函数的主要功能是刷新所有打开的 FILE 流的缓冲区,确保数据从内存写入到对应的文件或设备中。
2024-11-28 19:32:46
1797
2
原创 【C/C++】函数可变参数
C语言通过标准库提供的stdarg.h使得函数能够灵活地处理可变参数。通过va_list和相关宏,程序能够在运行时获取并处理不同数量和类型的参数。尽管C语言本身不提供对类型安全的保障,使用可变参数时依然能够通过合理设计函数接口来保证代码的清晰和可维护性。
2024-11-28 15:17:04
2682
1
原创 【MySQL】备份与恢复
可以看到,记录了我们对这个数据库的相关操作。打开一个新的终端,创建一个目录。可以看到执行了相关的sql。进入数据库查看内容。
2024-11-25 08:33:50
1543
2
原创 【C/C++】main函数为什么要return 0?
在C语言中,return 0通常出现在main函数的末尾,表示程序的正常退出。返回值0是一个约定,表示程序执行没有发生错误或者异常终止。这是操作系统和其他程序用来判断程序是否成功执行的一种方式。OS设计者很多时候都喜欢用0表示成功,其他退出码就表示不同的错误信息。我们看看GLibc库的源码0646465666768这就是为什么返回0,而不是返回其他,其实就是一个约定。1、从系统角度,给父进程一个结果,告诉父进程该进程运行的结果。
2024-11-21 22:53:04
3036
2
原创 【ProtoBuf】Ubuntu安装ProtoBuf
创建 swap 的文件(分配 8G 的swap分区大小),尽量分配比较大,后面执行结束删除分区。确认已删除: 重新运行 swapon --show 来确认 /swapfile 已不再显示。如果不执行下面操作,直接执行make check 就会出现,这里就失败了。在开始之前,请先使用命令检查您的 Ubuntu 系统的SWAP 分区。再开始下一步之前,如果自己的云服务器是2核2G,建议先执行下面步骤。禁用交换分区: 先禁用当前的交换分区,确保系统不再使用它。这样就成功了,可以删除刚才的分区了。
2024-11-21 14:41:20
5084
3
原创 【MySQL】 Ubuntu安装MySQL
看到active(running)表示服务正常启动,安装成功。退出MySQL,输入quit;点下箭头然后再回车选择第二个选项。此时这样就欧克,APT准备成功。下载发布包到ubuntu之后。继续重复输入密码,再回车。下箭头到ok,再回车。
2024-11-20 13:18:14
1531
原创 【Linux】信号
需要我们设置一个处理函数。示例代码int main()//这里选择的8号信号cnt++;sleep(1);return 0;查看现象可以看到,程序执行了我们自己写的处理函数SIGKILL仍然不能被捕获,只能执行自己的默认处理函数,这个也是为了系统安全。这里就可以演示硬件信号的不同了。示例代码int main()cnt++;sleep(1);int a = 10;a/=0;return 0;查看现象这里是无限死循环的执行信号处理函数。分析原因。
2024-11-15 15:15:58
2562
1
原创 【C/C++】库缓冲区
GLibc(GNU C Library)为文件 I/O 提供了三种常见的缓冲模式:无缓冲、行缓冲和全缓冲,每种模式的工作原理和使用场景有所不同。文件是全缓冲,所以在fork之后,子进程会继承父进程的数据,当程序结束,库刷新缓冲区,父进程刷新,子进程就会发生写时拷贝,之后子进程又刷新,所以就是2份,而系统调用write是直接写入文件,所以只有一份。文件默认是全缓冲,库函数先写入到库缓冲区,在程序结束后,GLibc才会刷新到文件,但是此时write已经执行,所以write打印在前面。仍然可以达到库的效果。
2024-11-14 15:25:11
3188
1
原创 【Linux】TPGID
在操作系统中,特别是类 Unix 系统中,终端和进程管理是核心组成部分。TPGID(Terminal Process Group ID)是与进程组和终端设备的交互密切相关的一个概念。本文将详细介绍 TPGID 的定义、作用以及在进程和终端交互中的应用。TPGID(Terminal Process Group ID)是与终端设备密切相关的一个进程组标识符,它在管理前后台进程、信号传递以及进程组控制中发挥着重要作用。
2024-11-12 19:05:55
1391
1
原创 【C++】验证STL容器线程不安全
在C++中,std::vector通常并不是线程安全的,因此在多线程环境中对std::vector进行读写操作可能会导致未定义行为。可以发现,有些_threadname没有打印出来,有些打印出来了,因为加了sleep的原因,这个现象还是比较固定,容易分析的,那么原因出在哪了,没错,就是vector,vector的扩容问题。1、多线程操作std::vector示例代码:构建一个简单的C++代码示例,在多线程中对std::vector执行插入和读取操作。至此,验证STL容器的vector线程不安全完成。
2024-11-10 16:51:20
4584
5
原创 【C++】二叉搜索树的实现
二叉搜索树是一种基础的二叉树数据结构,它在各类数据处理中广泛应用。二叉搜索树的特点是能够通过其节点特性快速完成查找、插入和删除操作,使得这些操作的平均时间复杂度为 O(logn)。本文将介绍二叉搜索树的概念,并通过 C++ 实现其基本的查找、插入和删除功能。在 C++ 中,我们首先定义一个节点类,包括颜色、值、左孩子、右孩子和父节点指针。K _key;{ }private:本文介绍了二叉搜索树的基本概念和特性,并展示了通过 C++ 实现二叉搜索树的查找、插入和删除功能。
2024-11-07 14:16:02
1448
2
原创 【C++】AVL树的插入与删除
AVL 树是一种高度平衡的二叉搜索树,以发明者 Adelson-Velsky 和 Landis 的名字命名。它通过在插入和删除操作后调整树的平衡,确保任意节点的左右子树高度差不超过 1。与红黑树类似,AVL 树的查找、插入和删除的时间复杂度为O(logn),但 AVL 树更加严格地平衡,因此通常在查找操作上表现更好。本文将介绍 AVL 树的特点,并通过 C++ 代码实现插入、删除、平衡和旋转操作。在 C++ 中,我们首先定义一个节点类,包括颜色、值、左孩子、右孩子和父节点指针。int _bf;
2024-10-31 14:57:38
1575
1
原创 【C++】红黑树的插入与删除
红黑树是一种平衡二叉搜索树,在插入和删除时可以通过调整节点的颜色和旋转操作来维持平衡。它广泛应用于各种数据结构中,比如 STL 中的 map 和 set,因为它能确保查找、插入和删除的时间复杂度为 O(logn)。本文将详细介绍红黑树的特点,并通过 C++ 实现插入、删除及测试代码。提示:以下是本篇文章正文内容,下面案例可供参考在 C++ 中,我们首先定义一个节点类,包括颜色、值、左孩子、右孩子和父节点指针。
2024-10-31 14:16:57
1824
2
原创 [PTA]7-4 找出三位水仙花数
本题要求编写程序,输出给定正整数M和N区间内的所有三位水仙花数。三位水仙花数,即其个位、十位、百位数字的立方和等于该数本身。
2024-09-22 14:50:37
2698
1
原创 [PTA]7-1 强迫症 7-2 两个数的简单计算器 7-3 Cassels方程
小强在统计一个小区里居民的出生年月,但是发现大家填写的生日格式不统一,例如有的人写 199808,有的人只写 9808。有强迫症的小强请你写个程序,把所有人的出生年月都整理成 年年年年-月月 格式。对于那些只写了年份后两位的信息,我们默认小于 22 都是 20 开头的,其他都是 19 开头的。
2024-09-22 14:48:35
1639
原创 [PTA]7-6 大炮打蚊子
现在,我们用大炮来打蚊子:蚊子分布在一个M×N格的二维平面上,每只蚊子占据一格。OOXOO其中,X为炮弹落点中心,O为紧靠中心的四个有杀伤力的格子范围。若蚊子被炮弹命中(位于X格),一击毙命,若仅被杀伤(位于O格),则损失一半的生命力。也就是说,一次命中或者两次杀伤均可消灭蚊子。现在给出蚊子的分布情况以及连续k发炮弹的落点,给出每炮消灭的蚊子数。
2024-09-22 14:41:07
1510
原创 [PTA]7-5 凯撒密码
为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。
2024-09-22 14:38:35
1850
原创 [PTA]7-3 宇宙无敌加法器
地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的。而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”。每个 PAT 星人都必须熟记各位数字的进制表,例如“……0527”就表示最低位是 7 进制数、第 2 位是 2 进制数、第 3 位是 5 进制数、第 4 位是 10 进制数,等等。每一位的进制 d 或者是 0(表示十进制)、或者是 [2,9] 区间内的整数。
2024-09-22 14:34:58
1228
原创 [PTA]7-2 冒泡法排序
将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。本题要求对任意给定的K(
2024-09-22 14:32:16
1699
原创 [PTA]7-1 输出学生成绩
本题要求编写程序,根据输入学生的成绩,统计并输出学生的平均成绩、最高成绩和最低成绩。建议使用动态内存分配来实现。
2024-09-22 14:24:39
3509
原创 [PTA]6-2 使用函数输出一个整数的逆序数 6-3 在数组中查找指定元素 6-4 递归求Fabonacci数列 6-5 使用函数求最大公约数 6-6 利用指针找最大值
其中函数reverse须返回用户传入的整型number的逆序数。其中list[]是用户传入的数组;n(≥0)是list[]中元素的个数;x是待查找的元素。如果找到则函数search返回相应元素的最小下标(下标从0开始),否则返回−1。函数f应返回第n个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。其中x和y是两个正整数,函数gcd应返回这两个数的最大公约数。其中px和py是用户传入的两个整数的指针。
2024-09-22 14:15:02
1491
原创 [PTA]6-1 使用函数求素数和
其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数PrimeSum返回区间[m, n]内所有素数的和。题目保证用户传入的参数m≤n。
2024-09-21 17:04:24
1833
原创 [PTA]6-1 使用函数实现字符串部分复制 6-2 查找子串
函数strmcpy将输入字符串char *t中从第m个字符开始的全部字符复制到字符串char *s中。若m超过输入字符串的长度,则结果字符串应为空串。
2024-09-21 16:55:36
1453
原创 7-2 用扑克牌计算24点
一副扑克牌的每张牌表示一个数(J、Q、K 分别表示 11、12、13,两个司令都表示 6)。任取4 张牌,即得到 4 个 1~13 的数,请添加运算符(规定为加+ 减- 乘* 除/ 四种)使之成为一个运算式。每个数只能参与一次运算,4 个数顺序可以任意组合,4 个运算符任意取 3 个且可以重复取。运算遵从一定优先级别,可加括号控制,最终使运算结果为 24。请输出一种解决方案的表达式,用括号表示运算优先。如果没有一种解决方案,则输出 -1 表示无解。
2024-09-21 16:46:26
1301
原创 [PTA]7-1 计算2个复数之和与之积
分别输入2个复数的实部与虚部,用函数实现计算2个复数之和与之积。若2个复数分别为:c1=x1+(y1)i, c2=x2+(y2)i,则:c1c2 = (x1x2-y1y2) + (x1y2+x2*y1)i。
2024-09-21 16:44:58
1280
原创 [PTA]7-5 一帮一
一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。
2024-09-21 16:40:18
1211
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅