memcpy和memmove
memcpy和memmove两个函数比较相似,但在使用的时候有些区别
memcpy的作用是,把源src所指的内存的地址的起始位置开始拷贝n个字节到目标dest
所指的把内存地址的起始位置中
实现代码如下:
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()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };my_memcpy(arr + 1, arr, 20);return 0;
}
因为往同一块区域中拷贝的时候(arr)位置的内容会覆盖掉后面(arr+1)要拷贝的内容
所以,后面要拷贝的(arr+1)的内容是被(arr)覆盖掉的。
而memmove不会出现这种问题
实现代码如下:
void* my_memmove(void* dest, const void* src, size_t num)
{void* ret = dest;assert(dest && src);if (dest < src){while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}}else{while (num--){*((char*)dest + num) = *((char*)src + num);}}return ret;
}
因为,memmove可以从要拷贝的最后一个字节向前拷贝 所以不会造成覆盖。
两个函数各有优缺:
memcpy:代码比较简洁,运行时间比较少,在不会被覆盖的情况下编译起来比较快。
memmove:因为加入了判定,运行时间会比memmove慢,但是不容易出错。
有的编译器里两个函数实现代码一样
memcpy和memmove相关推荐
- strcpy,memcpy和memmove区别
strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy ...
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数
一.函数介绍: 1.memcpy 函数原型:extern void *memcpy(void *dest, const void *src, size_t count); 用法:#include< ...
- memcpy 头文件_C|memcpy()和memmove()的比较及实现
memcpy()和memmove()函数的原型如下: void * memcpy ( void * dst, const void * src, size_t num ); void * memmov ...
- C和指针之字符串memcpy、memmove、memset使用总结
1.介绍memcpy.memmove.memset 1) void *memcpy(void *dest, const void *src, size_t n); 从源src所指的内存地址的起始位置开 ...
- memcpy、memmove、memset、memchr、memcmp、strstr详解
第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,m ...
- 关于memcpy和memmove两函数的区别
http://blog.csdn.net/caowei840701/article/details/8491836 [cpp] view plain copy <p> 关于memcpy和m ...
- memcpy和memmove的区别以及内存重叠问题
memcpy和memmove的区别以及内存重叠问题 转自:https://www.codecomeon.com/posts/89/ 区别 memcpy() 和 memmove() 都是C语言中的库函数 ...
- C语言学习笔记---数据拷贝函数memcpy()和memmove()函数
在C语言中拷贝字符串的时候通常可以使用strcpy()函数和strncpy()函数,这两个函数是专门针对字符串拷贝的.如果想要拷贝其他类型数组的话,可以使用memcpy()和memmove()函数 ...
- memcpy、memmove、memcmp、memset函数的使用说明和模拟实现
在前面的文章中,我已经对字符串函数进行了详细的介绍和模拟实现,今天,我来讲解另一类函数----------内存函数. 这里写目录标题 memcpy函数 memmove函数 memcmp函数 memse ...
- memcpy、memmove
前言 一.memcpy 1.介绍 2.使用 3.模拟实现 二.memmove 1.介绍 2.模拟实现 三.总结 前言 上一文,学习了字符串相同函数的使用,在某些场合,数据的类型不限于字符串,有可能是整 ...
最新文章
- 20018-05-16 第十天
- KVM虚拟机源代码分析
- [Java]jdbc[转]
- Visual Studio Code之常备快捷键
- oracle树结构查询----connect by语法详解
- 华为程序员面试要改:网上编程 90 分钟,现场编程 30 分钟
- MYSQL的函数有哪些?(4.1时间与日期函数)
- 【BZOJ】1679: [Usaco2005 Jan]Moo Volume 牛的呼声(数学)
- 华为交换机不同网段互访_华为交换机实现不同VLAN之间互访
- 计算机语言的比较英文论文,科学网—撰写高质量英文科技论文的心态、布局、程序和方法 - 岳中琦的博文...
- 自我提高网站list
- cad插件_CAD插件自动编号安装教程
- SpringBoot实现本地、网络文件下载、zip压缩包批量下载
- idea 光标 快捷键_idea 快捷键汇总
- Leetcode-714. 买卖股票的最佳时机含手续费
- autocad2014 菜单栏 闪退_AutoCAD2014闪退解决办法
- linux系统读移动硬盘,在linux系统上识别与挂载移动硬盘数据
- VS Code 所选驱动器或UNC共享不存在或不可访问。请另外选择
- GitHub Copilot 被爆存在安全漏洞,涉及四成代码
- 基于python的图像处理的毕业论文_个人毕业设计基于python开发的图像论文34646.doc...