【C】memory 详解
<memory.h> 是一个 C 标准库头文件,提供了一组内存管理函数,用于分配、释放和操作动态内存。这些函数主要操作的是未初始化的内存块,是早期 C 编程中常用的内存操作工具。
尽管在现代 C++ 编程中更推荐使用<cstring>或<memory>,但<memory.h>在兼容性和某些低级场景下仍然可能被使用。
以下是对<memory.h>中核心内容的详解:
核心功能与函数
memory
void* memcpy(void* dest, const void* src, size_t n);
- 功能: 将
n字节的数据从源地址src复制到目标地址dest。 - 注意事项:
- 源地址和目标地址不能重叠,如果存在重叠,行为未定义。
- 通常用于快速内存复制。
- 示例:
char src[] = "hello";
char dest[10];
memcpy(dest, src, sizeof(src));
memmove
void* memmove(void* dest, const void* src, size_t n);
- 功能: 将
n字节的数据从源地址src移动到目标地址dest。 - 区别于
memcpy: 允许源地址和目标地址重叠。 - 示例:
char buffer[] = "abcdef";
memmove(buffer+2, buffer, 4); // 缓冲区重叠
memset
void* memset(void* ptr, int value, size_t n);
- 功能: 将内存块
ptr的前n字节设置为指定的值value(按字节操作)。 - 常用场景: 清零或初始化内存块。
- 示例:
char buffer[10];
memset(buffer, 0, sizeof(buffer)); // 将整个缓冲区清零
memcmp
int memcmp(const void* ptr1, const void* ptr2, size_t n);
- 功能: 比较两块内存的前
n字节。 - 返回值:
0:两块内存相等。< 0:ptr1小于ptr2。> 0:ptr1大于ptr2。
- 示例:
char a[] = "abc";
char b[] = "abc";
if(memcmp(a, b, 3) == 0) {printf("Equal\n");
}
malloc
void* malloc(size_t size);
- 功能: 分配
size字节的动态内存,返回指向该内存块的指针。 - 注意: 返回的内存未初始化,可能包含垃圾值。
- 示例:
int* arr = (int*)malloc(10 * sizeof(int));
calloc
void* calloc(size_t num, size_t size);
- 功能: 分配可以存储
num个元素的动态内存,并初始化为零。 - 区别于
malloc: 自动清零。 - 示例:
int* arr = (int*)calloc(10, sizeof(int)); // 分配10个int,初始化为0
realloc
void* realloc(void* ptr, size_t new_size);
- 功能: 调整已分配内存的大小。
- 注意:
- 如果
ptr为NULL,行为类似于malloc。 - 如果
new_size为0,行为类似于free。 - 可能返回新地址(原地址不一定保留)。
- 如果
- 示例:
int* arr = (int*)malloc(10 * sizeof(int));
arr = (int*)realloc(arr, 20 * sizeof(int)); // 扩展到 20 个int
free
void free(void *ptr);
- 功能: 释放由
malloc、calloc或realloc分配的动态内存。 - 注意:
- 如果传递
NULL,free不会产生任何操作。 - 释放后,指针应置为
NULL,以避免悬空指针问题。
- 如果传递
- 示例:
int* arr = (int*)malloc(10 * sizeof(int));
free(arr);
arr = NULL; // 避免悬空指针
内存管理注意事项
- 内存泄漏:
- 动态分配的内存必须由程序员显式释放。
- 释放后不要再使用该内存块(避免“悬空指针”)
- 指针安全:
- 初始化指针为
NULL,并在释放后将指针设置为NULL。
- 初始化指针为
- 越界访问:
- 确保访问的内存块不超过已分配大小。
- 性能考虑:
- 动态内存分配有一定开销,频繁分配和释放可能影响性能。
<memory.h> 和 <string.h> 的区别
<memory.h>是 C 语言标准的传统头文件,主要定义了内存管理和操作相关函数。<string.h>是 C 标准中更常用的头文件,包含了一些字符串处理相关的函数,例如strcpy、strcat等。- 在现代C++中,推荐使用
<cstring>来替代<memory.h>。
<memory.h> 的现代替代
在 C++ 中,更推荐使用标准模板库(STL)和智能指针(std::unique_ptr,std::shared_ptr)进行内存管理,从而减少手动操作动态内存的风险。
示例:
#include <memory>
#include <iostream>int main() {auto ptr = std::make_unique<int[]>(10); // 自动管理内存for(int i=0; i<10; ++i) {ptr[i] = i * i;std::cout << ptr[i] << " ";}return 0;
}
总结
<memory.h> 提供了低级别的内存操作工具,适合在对性能和资源管理有较高要求的场景中使用。但在现代 C++ 编程中,更推荐使用高层抽象工具,如STL容器和智能指针,来提高代码的可读性和安全性。
相关文章:
【C】memory 详解
<memory.h> 是一个 C 标准库头文件,提供了一组内存管理函数,用于分配、释放和操作动态内存。这些函数主要操作的是未初始化的内存块,是早期 C 编程中常用的内存操作工具。 尽管在现代 C 编程中更推荐使用<cstring>或<memory&…...
linux——进程树的概念和示例
一些程序进程运行后,会调用其他进程,这样就组成了一个进程树。 比如,在Windows XP的“运行”对话框中输入“cmd”启动命令行控制台,然后在命令行中输入“notepad”启动记事本,那么命令行控制台进程“cmd.exe”和记事本进程“note…...
分布式系统相关面试题收集
目录 什么是分布式系统,以及它有哪些主要特性? 分布式系统中如何保证数据的一致性? 解释一下CAP理论,并说明在分布式系统中如何权衡CAP三者? 什么是分布式事务,以及它的实现方式有哪些? 什么是…...
CSAPP学习:前言
前言 本书简称CS:APP。 背景知识 一些基础的C语言知识 如何阅读 Do-做系统 在真正的系统上解决具体的问题,或是编写和运行程序。 章节 2025-1-27 个人认为如下章节将会对学习408中的操作系统与计算机组成原理提供帮助,于是先凭借记忆将其简单…...
kaggle比赛入门 - House Prices - Advanced Regression Techniques(第三部分)
本文承接上一篇。 1. 数据预处理流水线(pipelines) from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline from sklearn.impute import SimpleImputer from sklearn.preprocessing import StandardScaler, OneHotEnc…...
Linux 命令之技巧(Tips for Linux Commands)
Linux 命令之技巧 简介 Linux 是一种免费使用和自由传播的类Unix操作系统,其内核由林纳斯本纳第克特托瓦兹(Linus Benedict Torvalds)于1991年10月5日首次发布。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户…...
从 GShard 到 DeepSeek-V3:回顾 MoE 大模型负载均衡策略演进
作者:小天狼星不来客 原文:https://zhuanlan.zhihu.com/p/19117825360 故事要从 GShard 说起——当时,人们意识到拥有数十亿甚至数万亿参数的模型可以通过某种形式的“稀疏化(sparsified)”来在保持高精度的同时加速训…...
【番外篇】鸿蒙扫雷天纪:运混沌灵智勘破雷劫天局
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 这一节课我们不学习新的知识,我们来做一个扫雷小游戏 目录 扫雷小游戏概述一、扫雷游戏分析…...
【反悔堆】力扣1642. 可以到达的最远建筑
给你一个整数数组 heights ,表示建筑物的高度。另有一些砖块 bricks 和梯子 ladders 。 你从建筑物 0 开始旅程,不断向后面的建筑物移动,期间可能会用到砖块或梯子。 当从建筑物 i 移动到建筑物 i1(下标 从 0 开始 )…...
字符串算法笔记
字符串笔记 说到字符串,首先我们要注意的就是字符串的输入以及输出,因为字符串的输入格式以及要求也分为很多种,我们就来说几个比较常见的格式 g e t s gets gets 我们先来说这个函数的含义...
AWTK 骨骼动画控件用法
创建骨骼动画控件 atlas 指定纹理图集文件,skeleton 指定骨骼动画数据文件。可以是相对路径或绝对路径。atlas 中引用的图片文件需要和 skeleton 文件在同一目录下。 scale_x 和 scale_y 指定缩放比例,根据实际情况调整。 scale_time 指定播放速度&am…...
解决Oracle SQL语句性能问题(10.5)——常用Hint及语法(7)(其他Hint)
10.5.3. 常用hint 10.5.3.7. 其他Hint 1)cardinality:显式的指示优化器为SQL语句的某个行源指定势。该Hint具体语法如下所示。 SQL> select /*+ cardinality([@qb] [table] card ) */ ...; --注: 1)这里,第一个参数(@qb)为可选参数,指定查询语句块名;第二个参数…...
如何写美赛(MCM/ICM)论文中的Summary部分
美赛(MCM/ICM)作为一个数学建模竞赛,要求参赛者在有限的时间内解决一个复杂的实际问题,并通过数学建模、数据分析和计算机模拟等手段给出有效的解决方案。在美赛的论文中,Summary部分(通常也称为摘要)是非常关键的,它是整个论文的缩影,能让评审快速了解你解决问题的思…...
DataWhale组队学习 fun-transformer task5
1. 词向量:单词的“身份证” 首先,我们定义了四个单词的词向量,每个向量维度为3。你可以把这些词向量想象成每个单词的“身份证”。每个身份证上有3个特征,用来描述这个单词的“性格”或“特点”。 word_1 np.array([1, 0, 0])…...
【huawei】云计算的备份和容灾
目录 1 备份和容灾 2 灾备的作用? ① 备份的作用 ② 容灾的作用 3 灾备的衡量指标 ① 数据恢复时间点(RPO,Recoyery Point Objective) ② 应用恢复时间(RTO,Recoyery Time Objective) 4…...
电力晶体管(GTR)全控性器件
电力晶体管(Giant Transistor,GTR)是一种全控性器件,以下是关于它的详细介绍:(模电普通晶体管三极管进行对比学习) 基本概念 GTR是一种耐高电压、大电流的双极结型晶体管(BJT&am…...
LQ1052 Fibonacci斐波那契数列
题目描述 Fibonacci斐波那契数列也称为兔子数列,它的递推公式为:FnFn-1Fn-2,其中F1F21。 当n比较大时,Fn也非常大,现在小蓝想知道,Fn除以10007的余数是多少,请你编程告诉她。 输入 输入包含一…...
Cursor 帮你写一个小程序
Cursor注册地址 首先下载客户端 点击链接下载 1 打开微信开发者工具创建一个小程序项目 选择TS-基础模版 官方 2 然后使用Cursor打开小程序创建的项目 3 在CHAT聊天框输入自己的需求 比如 小程序功能描述:吃什么助手 项目名称: 吃什么小程序 功能目标…...
【机器学习】嘿马机器学习(算法篇)第13篇:决策树算法,学习目标【附代码文档】
本教程的知识点为:机器学习算法定位、 K-近邻算法 1.4 k值的选择 1 K值选择说明 1.6 案例:鸢尾花种类预测--数据集介绍 1 案例:鸢尾花种类预测 1.8 案例:鸢尾花种类预测—流程实现 1 再识K-近邻算法API 1.11 案例2:预测…...
echo ‘export PATH=/usr/local/bin:$PATH‘ >> ~/.bashrc这个和直接添加到/etc/profile有什么区别
echo export PATH/usr/local/bin:$PATH >> ~/.bashrc 和直接添加到 /etc/profile 都是用于修改 PATH 环境变量,但它们适用的范围和效果有所不同: 1. 修改 ~/.bashrc 文件 作用范围:~/.bashrc 是针对当前用户的配置文件,它…...
菜鸟之路Day09一一集合进阶(二)
菜鸟之路Day09一一集合进阶(二) 作者:blue 时间:2025.1.27 文章目录 菜鸟之路Day09一一集合进阶(二)0.概述1.泛型1.1泛型概述1.2泛型类1.3泛型方法1.4泛型接口1.5泛型通配符 2.Set系列集合2.1遍历方式2.2HashSet2.3LinkedHashSet2.4TreeSet 0.概述 内…...
写在新年之际
各位关注我的小伙伴们,大家好! 在这新年来临之际,首先祝大家新年快乐!愿新的一年充满机遇与收获,愿我们在各自的领域中继续突破和成长! 回顾2024年,这是充满变革的一年,不仅世界局…...
【shell工具】编写一个批量扫描IP地址的shell脚本
批量扫描某个网段中的主机(并发) 创建目录编写脚本文件 mkdir /root/ip_scan_shell/ touch /root/ip_scan_shell/online_server.txt touch /root/ip_scan_shell/offline_server.txt touch /root/ip_scan_shell/ip_scan.sh写入下面shell到脚本文件中…...
分库分表后如何进行join操作
在分库分表后的系统中,进行表之间的 JOIN 操作比在单一数据库表中复杂得多,因为涉及的数据可能位于不同的物理节点或分片中。此时,传统的 SQL JOIN 语句不能直接用于不同分片的数据,以下是几种处理这样的跨分片 JOIN 操作的方法&a…...
004 mybatis基础应用之全局配置文件
文章目录 配置内容properties标签typeAlias标签mappers标签 配置内容 SqlMapConfig.xml中配置的内容和顺序如下: properties(属性) settings(全局配置参数) typeAliases(类型别名) typeHandler…...
vim如何设置制表符表示的空格数量
:set tabstop4 设置制表符表示的空格数量 制表符就是tab键,一般默认是四个空格的数量 示例: (vim如何使设置制表符表示的空格数量永久生效:vim如何使相关设置永久生效-CSDN博客)...
基于dlib/face recognition人脸识别推拉流实现
目录 一.环境搭建 二.推拉流代码 三.人脸检测推拉流 一.环境搭建 1.下载RTSP服务器MediaMTX与FFmpeg FFmpeg是一款功能强大的开源多媒体处理工具,而MediaMTX则是一个轻量级的流媒体服务器。两者结合,可以实现将本地视频或者实时摄像头画面推送到RTSP流,从而实现视频…...
LangChain:使用表达式语言优化提示词链
在 LangChain 里,LCEL 即 LangChain Expression Language(LangChain 表达式语言),本文为你详细介绍它的定义、作用、优势并举例说明,从简单示例到复杂组合示例,让你快速掌握LCEL表达式语言使用技巧。 定义 …...
多线程编程杂谈( 下)
问题 是否存在其它中途线程退出的方法? 通过调用Linux系统函数 pthread_cancel(...) 可中途退出线程 Linux 提供了线程取消函数 取消状态 接受取消状态: PTHREAD_CANCEL_ENABLE拒绝取消状态: PTHREAD_CANCEL_DISABLE 取消请求 延迟取消: PTHREAD_CANCEL_DEFERR…...
rdma-core debug
export MLX5_DEBUG_MASK0xff export MLX5_DEBUG_FILE/tmp/mlx5.txt git clone https://github.com/linux-rdma/rdma-core.git cd rdma-core ./build.sh 修改build/CMakeCache.txt MLX5_DEBUG:BOOLTRUE function install_rdma_core {local dir/swgwork/cmi/rdma-core/buil…...
