C语言:内存函数

article/2025/6/20 17:23:42

目录

一、引言

二、memcpy

三、memmove

四、memset

五、memcmp


一、引言

C语言作为一门经典的系统编程语言,以其高效性和底层操作能力广泛应用于操作系统、驱动开发及嵌入式系统中。掌握C语言的内存函数,不仅是写出高性能程序的基础,也是避免潜在内存错误的关键。有哪些常用的内存函数?这些函数在实际开发中又该如何正确使用?

本篇博客将深入介绍C语言中的内存函数,包括memcpy,memmove,  memset , memcmp帮助读者理解它们的功能、使用场景以及注意事项。通过详细的示例和实践经验,期望能够让你在面对动态内存管理时更加得心应手,写出安全、高效的C程序。

二、memcpy

1、基本使用

memcpy 包含在头文件 <string.h> 中 ,它的原型如下:

void* memcpy(void* destination, const void* source, size_t num);

功能:从 source 指向的位置开始向后复制 num 个字节的数据到 destination 指向的空间。

返回值:目标空间的起始地址

注意事项:该函数适用于所有类型的数据,因此遇到 \0 不会停下来;

                  如果source和destination有任何的重叠,复制的结果都是未定义的。

用法举例:

int main()
{int arr1[] = { 0,1,2,3,4,5,6,7,8,9 };int arr2[15];memcpy(arr2, arr1 , 10*sizeof(int));return 0;
}

2、模拟实现 memcpy

void* my_memcpy(void* dest, const void* sour, size_t num)
{assert(dest && sour);void* ret = dest;while (num){*(char*)dest = *(char*)sour;dest = (char*)dest + 1;sour = (char*)sour + 1;num--;}return ret;
}

由于 memcpy 适用于任何类型,所以拷贝的时候要以最小单位(一个字节)进行拷贝,因此会把指针强制类型转换成 char*

三、memmove

1、基本使用

memmove 包含在 <string.h> 中,它的原型如下:

void* memmove(void* destination, const void* source, size_num);

功能:和 memcpy 一样,将 source 指向的空间拷贝到 destination 指向的空间,但与 memcpy 不同的是,memmove 的源空间和目标空间可以重叠

返回值:返回目标空间起始地址

什么是目标空间与源空间的重叠?

如图,这是一个存放着1~10的整型数组,我要将蓝色的地方拷贝到红色的地方,可以看到,蓝色矿与红色框是有重叠的,这种情景就称为目标空间与源空间的重叠

用法举例:

int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9 ,10};memmove(&arr[2], arr,sizeof(int)*4);return 0;
}

2、模拟实现 memmove

由于 memmove 可以处理目标空间与源空间重叠的情况,那我们就要仔细考虑一下如何拷贝,最简单的办法就是在重新开辟一个新的空间用来复制源空间,但这样太占用内存,所以我们得考虑一下算法:

第一种情况:

可以看到,我们必须从后往前拷贝,因为如果从前往后拷贝,会导致源空间后面数据的修改

第二种情况:

这种情况必须从前往后拷贝

第三种情况:

这种没有重叠,从前往后拷贝和从后往前拷贝都是可以的

总结一下:当 dest < source 时,从前往后拷贝,当 dest > source 时,从后往前拷贝

所以模拟 memmove 的代码如下:

void* my_memmove(void* dest, const void* sour, size_t num)
{assert(dest && sour);char* ret = dest;//从前往后拷贝if (dest < sour){while (num--){*(char*)dest = *(char*)sour;dest = (char*)dest + 1;sour = (char*)sour + 1;}}else//从后往前拷贝{while (num--){*((char*)dest + num) = *((char*)sour + num);}}return ret;
}

四、memset

memset 包含在 <string.h> 中,它的原型如下:

void* memset(void*ptr ,int value, size_t num);

功能:设置内存块的内容,将内存中指定的长度空间设置为指定的内容

ptr:指向要设置的空间

value:要设置的值

num:要设置得的内存长度,单位为字节

返回值:返回目标空间起始地址

使用举例:

int main()
{char arr[] = "matongtongchenglang";memset(arr + 9, 's', 5);return 0;
}

 值得注意的是,memset 以字节为单位,对整型不能使用

五、memcmp

该函数包含在 <string.h> 中,它的原型如下:

int memcmp(const void* ptr1, const void*ptr2, size_t num);

功能:比较两块内存的内容,从 ptr1,ptr2开始向后 num 个字节

返回值:若 ptr1 > ptr2 ,返回大于 0 的数字;

              若 ptr1 = ptr2 ,返回 0 ;

              若 ptr1 < ptr2 ,返回小于 0 的数字;

用法举例:

int main()
{int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[] = { 1,2,3,4,8 };int r = memcmp(arr1, arr2 ,4*sizeof(int));return 0;
}


http://www.hkcw.cn/article/tjfTItwigx.shtml

相关文章

女孩高空滑索坠落景区涉事项目整改 安全带隐患待查

女孩高空滑索坠落景区涉事项目整改!6月1日下午4点多,南宁市西乡塘区芦仙山景区飞越丛林探险乐园发生了一起惊险事件。一名10岁女孩在高空滑索过程中,从距离地面七八米的高空中坠落,经医生检查身体并无大碍。据孩子父母说,当天下午2点20分左右,他们带着女儿小枚(化名)上…

苏超出圈火到A股 足球概念股飙升

6月3日,市场低开高走迎来节后开门红,创业板指领涨。A股半天成交额7640.07亿元,较上个交易日缩量76.72亿元。盘面上,市场热点良性轮动,个股涨多跌少,全市场超3400只个股上涨。截至午间收盘,沪指涨0.48%,深成指涨0.35%,创业板指涨0.73%。新消费概念股再度大涨,美容护理…

【笔记】在 MSYS2 MINGW64 环境中降级 NumPy 2.2.6 到 2.2.4

&#x1f4dd; 在 MSYS2 MINGW64 环境中降级 NumPy 到 2.2.4 ✅ 目标说明 在 MSYS2 的 MINGW64 工具链环境中&#xff0c;将 NumPy 从 2.2.6 成功降级到 2.2.4。 &#x1f9f0; 环境信息 项目内容操作系统Windows 11MSYS2 终端类型MINGW64&#xff08;默认终端&#xff09;Py…

蔚来车主高速开车睡觉 李斌回应 强调辅助非自动

蔚来汽车创始人李斌近日转发了一位博主的经历,该博主在下雨天以110km/h的速度在高速公路上开车时睡着了,车辆自动触发紧急靠边停车,并通过SOS电话唤醒车主。李斌借此机会再次提醒大家注意驾驶安全。他提到,“蔚来世界模型NWM”已经量产了“紧急自主靠边停车”功能。当辅助驾…

坠河遇难新人原计划第二天举行婚礼 悲剧突发震惊亲友

6月1日,江苏靖江市一网友发布视频称,当天本是其亲友举行婚礼的日子,但在婚礼前一天,这对新人开车坠河双双遇难。视频中显示一辆白色小车被从河中吊起,现场有交警等工作人员处理。该网友定位在靖江市西来镇。6月3日,靖江市交警部门和西来派出所均表示接到此事的报警,但未…

蔚来能重回第一梯队吗?挑战面前,蔚来必须加快脚步

蔚来能重回第一梯队吗?「挑战面前,蔚来必须加快脚步」在一季度销售淡季褪去之后,中国车市再度疯狂竞技,战事卷土重来。中国车企已经深刻意识到,要么“价格内卷”,要么“价值加倍”,总有一种情绪价值到位,才能在残酷竞技场存活下来。只有找准节奏,玩家才能积蓄势能,满…

男子向棋牌室借4000赌博输光不还,法院:不用还

江苏的孙某在县城开了一家棋牌室,章某是棋牌室的老客户,此前,章某在棋牌室参与赌博输了精光,向孙某借了4000元后再次输光,后孙某多次催要欠款无果,将章某告上了法庭。法院审理认为,原告的借款行为,从主客观来说,都属于不法要件,存在主观上的恶意,违反了公序良俗,最…

男子骑车闯红灯被撞还要负全责 规则面前无弱者

在处理道路交通事故时,责任认定基于客观事实和过错责任原则。法律保护的是遵守规则的行为,而非“弱者身份”。济南交警公布了一起相关事故案例。2025年2月6日13时16分,赵某驾驶鲁AN*5无轨电车沿历城区北园大街由东向西行驶,遇到李某驾驶电动自行车闯红灯逆向行驶,双方发生…

记者质疑伊万:战术混乱致球员脑浆都沸腾了 印尼主帅:我也发懵 备战真顺利?

6月3日,国足主帅伊万科维奇抵达印尼后表示,球队在上海的备战顺利,队员们状态良好。他一直保持乐观态度,无论面对印尼队还是其他任何对手,都会积极争取胜利。然而,记者裴力在社交媒体上对这一说法提出了质疑。他认为,国足在上海的备战并不如伊万科维奇所描述的那样顺利,…

Laplace 噪声

Laplace 噪声是一种特定概率分布&#xff08;拉普拉斯分布&#xff09;产生的随机扰动。它是差分隐私&#xff08;Differential Privacy, DP&#xff09;中最核心、最常用的噪声机制之一。它的核心作用是在不泄露个体信息的前提下&#xff0c;允许从包含敏感数据的数据库中提取…

女子产子 孙子比儿子大3岁 48岁再婚妈妈超快顺产

广东河源市一位48岁的再婚女子在怀孕7个月时误以为自己绝经发福,最终于6月2日平安生产。她的28岁女儿陪产,并透露母亲仅用15分钟就顺利顺产,生下了一个男孩。女儿发文表示:“结束了我28年独生女生涯,从此多一个人为妈妈保驾护航了”,欢迎弟弟的到来。这名女子和现任丈夫相…

哈佛演讲女生称没有绿卡 回应身份争议

6月2日,扬子晚报报道,5月29日在哈佛大学毕业典礼上,蒋雨融作为毕业生代表发表演讲,成为哈佛近四百年校史中第一位站在毕业讲台上的中国女生。她的演讲视频在网络上迅速走红,但随后有网友质疑其父亲在绿发会的职位可能为她积累了国际活动经历提供了便利,引发大量争议。6月…

苏超梗图太好笑了 江苏人民玩梗开赛

直播吧05月31日讯 江苏省城市足球联赛第3轮今天下午开赛,常州队vs扬州队、镇江队vs宿迁队、徐州队vs连云港队。江苏人民已经开始玩梗了。责任编辑:zhangxiaohua

男子将6岁女童拖入小巷该罚多重 好心人及时制止

近日,湖南娄底的赵女士表示,她6岁的女儿在放学途中被一名陌生男子拖入巷子。视频中可以看到,小女孩哭得非常伤心。据赵女士描述,幸亏楼上的一位好心爷爷及时冲下来制止并报警。涉事男子试图逃跑,甚至拿出烟和红包试图收买老人,并进行言语威胁。最终,该男子被抓捕,并辩称…

苏超缘何盛产热梗 散装江苏的“德比”文化

江苏省城市足球联赛首次举办,13个设区市各组一支队伍进行比赛。三轮过后,南通队暂列第一。比赛不仅展现了激烈的竞技场面,还引发了广泛的网络话题和段子。无锡队在客场挑战泰州队时失利,有人调侃是因为无锡人嗜甜,在外地吃了不放糖的汤面导致低血糖。而泰州队获胜则被戏称…

贾跃亭数度哽咽:散户救了我们的命,感谢长期支持者

6月3日,一段贾跃亭在首届“FFAI首年度股东日”活动上的讲话视频流出。一位从乐视早期就开始追随贾跃亭投资乐视和FF的股民自费从国内飞到洛杉矶参加活动,表达了对贾跃亭东山再起的期盼。贾跃亭在现场数度哽咽,表示FF能够存活下来是因为散户的支持,甚至是散户救了公司的命。…

女子因美甲导致手指感知失灵被夹断 厚实美甲成“元凶”

女子因美甲导致手指感知失灵被夹断 厚实美甲成“元凶”!精致的美甲受到许多爱美女性的喜爱。然而,厚实的美甲可能导致手指变得“迟钝”,从而引发安全隐患。四川省骨科医院近日收治了一位因美甲导致手指感知失灵而被门夹断的患者。5月底,刘佳(化名)在家中不慎被门夹到左手…

买了就后悔的水果 尝鲜需谨慎!

买了就后悔的水果 尝鲜需谨慎!水果世界总是充满新奇,但有些“奇葩果”却让消费者在尝鲜后追悔莫及。比如拇指西瓜,外观像迷你版的小西瓜,十分可爱。然而,品尝时会发现它根本没有西瓜的清甜多汁,味道和口感更像黄瓜,水分还不足,里面满是籽。价格却比普通黄瓜贵很多,花了…

单例模式深度解析:从原理到应用实战

作者简介 我是摘星&#xff0c;一名全栈开发者&#xff0c;专注 Java后端开发、AI工程化 与 云计算架构 领域&#xff0c;擅长Python技术栈。热衷于探索前沿技术&#xff0c;包括大模型应用、云原生解决方案及自动化工具开发。日常深耕技术实践&#xff0c;乐于分享实战经验与…

印度一银行59公斤黄金被盗 重大盗窃案震动当地

印度一银行59公斤黄金被盗!印度卡纳塔克邦维贾亚普拉地区的卡纳拉银行芒戈利支行发生了一起重大黄金盗窃案,被盗黄金重达59公斤。这些黄金是客户用于抵押贷款的。当地警察局局长拉克斯曼尼姆巴吉表示,警方已经成立了8个小组调查此案。银行于5月23日(周五)晚照常关门,由于…