memcpy,memmove,memcmp,memset内存函数
目录
memcpy内存拷贝函数
memmove函数
memcmp函数介绍
memset内存设置函数
memcpy内存拷贝函数
memcpy是内存拷贝函数,从源字符串src所指向的起始位置,拷贝到目标字符串dest的起始位置中。从src拷贝n个字节的起始位置地址到目标dest的起始位置地址。与strcpy不一样,memcpy可以拷贝任何数据,整形,字符等。而strcpy只能拷贝字符串。
- 1.source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针.
- 2.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
- 注意:source和destin都不一定是数组,任意的可读写的空间均可
来源于:memcpy函数的使用方法 - elegang - 博客园
memcpy会发生内存区域的重叠,如果想要处理重叠则可以使用memmove。
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同,strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
memcpy的模拟实现
void* my_memcpy(void* dest,const void* src,size_t num)
{void* ret = dest;assert(dest && src);while (num--) {*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}
int main()
{//实现memcpyint arr1[10] = { 1,2,3,4,5,6,7,8,9 };int arr2[10] = { 0 };my_memcpy(arr2, arr1, 5 * sizeof(int));int i = 0;for (i = 0; i < 5; i++) {printf("%d ", arr2[i]);}
}
memmove函数
与memcpy类似,memmove可以处理重叠问题。
如果目标区域和源区域有重叠的话:
memcpy不能够确保源串所在重叠区域在拷贝之前被覆盖。
memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后src内容会被更改,当目标区域与源区域没有重叠则和memcpy函数功能相同。
但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。
来源:memcpy memmove区别和实现 - 可可西 - 博客园
memmove模拟实现
我们可以发现当dest>src的时候,从后往前移动,当dest<src的时候从前往后
我们分别举个例子
当dest>src
当dest<src
//memmove模拟实现
void* my_memmove(void* dest, void* src, size_t num)
{void* ret = dest;//src<dest 从后往前assert(dest && src);if (dest > src){while (num--){*((char*)dest + num) = *((char*)src + num);}}//src>dest从前往后else{while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}return ret;
}
memcmp函数介绍
memcmp是内存比较函数是比较每一个字节的大小。
memset内存设置函数
memset函数的使用
int main()
{char str[] = "hello,csdn";memset(str, '$', 5);printf("%s", str);return 0;
}
将str的前5个字符全部换成$
这里如果改变的是数字的话只改变每一个字节。
memcpy,memmove,memcmp,memset内存函数相关推荐
- 自己实现内存操作函数memset(),memcmp(),memcpy(),memmove()
1.memset()内存设置函数(初始化) void *my_memset(void* dest, int c, size_t count) { assert(dest != NULL); char ...
- c/c++内存函数(memcpy,memmove,memset,memcmp)的详解和自已实现
1.mempy指的是C和C++使用的内存拷贝函数, 函数原型为void* memcpy(void* destin, void* source, unsigned n): 函数的功能是从源内存地址的起始 ...
- 【C语言】memcmp、memcpy、memmove、memset、memchr函数详解
目录 一.综述 二.介绍 1.memcmp 2.memcpy 3.memmove 4.memset 5.memchr 一.综述 memcmp.memcpy.memmove.memset.memchr都 ...
- memcpy、memmove、memset、memchr、memcmp、strstr详解
第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,m ...
- (memcpy,memmove...)内存函数还不会??别怕,我来助你一臂之力
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一.内存函数是什么 二.内存函数的分类(常见) 1.memcpy memcpy的模拟实现 2.memmove memmov ...
- 函数 —— strncpy() (内存重叠) memcpy() memmove() 一个字符串拷贝给另一个字符串
char *strncpy(char *dest, const char *src, size_t n) *strncpy(char *dest, const char *src, size_t n) ...
- C语言程序设计 | 模拟实现内存操作函数:strncpy, strncat, strncmp, memcpy, memmove
模拟实现字符串和内存操作函数(二)目录: strncpy strncat strncmp strcmp memcpy memmove strncpy char* strncpy(char* dst, ...
- 从memcpy到memmove,内存函数拷贝与内存重叠问题(重点内容)
有一个关于拷贝的问题,假如有这样一个字符串 char a[]="hello"; 我需要把这个字符串拷进另一个变量中 char a1[10]; 好像方法蛮多的,比如strcpy #d ...
- C和指针之字符串memcpy、memmove、memset使用总结
1.介绍memcpy.memmove.memset 1) void *memcpy(void *dest, const void *src, size_t n); 从源src所指的内存地址的起始位置开 ...
最新文章
- 2015大型互联网公司校招都开始了,薪资你准备好了嘛?
- Programming Computer Vision with Python (学习笔记十一)
- 【GAN优化外篇】详解生成模型VAE的数学原理
- Leaflet中通过setZIndex实现图层层级控制
- Android开发之系统信息——获取Android手机中SD卡内存信息
- Idea 插件 lombok 的安装和使用
- 学考语言成绩c对高考有影响吗_三大影响!考生务必上心,最近正在进行的学考对升学很重要...
- POJ 1192 最优连通子集(树形DP)
- VC9.VC10.VC11...各对应什么版本的VS,以及含义
- 微信小程序:强大的多功能图片处理器
- 基于Java的实现宠物管理系统的设计与实现
- 使用影子系统后win10导致的蓝屏解决办法
- 设置背景图片大小的方法
- 计算机组成原理中men,东北大学秦皇岛分校计算机组成原理课程设计.doc
- DIY强大的虚拟化环境-规划思路框架
- VS2015 scanf 函数报错 error C4996: 'scanf'
- Android 第三方QQ分享功能实现
- 攻防实战:如何检测或优化内存中的.NET Tradecraft
- 初学C语言的一点自我拙见
- Android Socket IQ聊天软件 之 聊天气泡编码步骤讲解
热门文章
- tortoisesvn的版本冲突
- 证券交易的量化接口的用途?
- 算法的优劣评估选择-常用方法
- GlobalObject::CollectGarbage Method
- 哇...简洁的桌面时间屏保(30秒搞定)
- 御龙在天手游怎么不显示服务器了,御龙在天手游经验怎么找回 等级不掉队方法解析...
- Apache APISIX 集成 HashiCorp Vault,生态系统再添一员
- 我所学到的EC-3(个人学习总结,不能保证正确,欢迎大佬指正)
- 丢失的8小时去哪里了?SimpleDateFormat线程不安全,多线程初始化异常解决方案
- toString与valueOf区别