memcpy函数与memmove函数
1.1
memcpy函数是C语言内存拷贝函数,功能是从原内存地址的起始位置开始依次拷贝若干个字节到从目标地址的起始位置开始依次向后的若干个字节中。
void* memcpy(void* dest,const void* src,size_t num)
void* dest是目标内存 const void* src是源内存 size_t num是拷贝字节个数
返回指向dest的void*指针
1.2
memmove是C语言内存拷贝函数,从源地址向目标地址拷贝若干个字节,如果目标区域与源区域相重叠,memmove能够保证源地址在被覆盖之前正确将重叠区域的字节拷贝到目标区域中。
void* memmove(void* dest,const void* src,size_t count)
void* dest是目标内存,const void* src是源内存,size_t是拷贝字节个数
返回指向dest的void*指针
1.3
memcpy和memmove函数的功能相似,但memcpy要复制的区域不能存在源与目标内存重叠,否则可能导致赋值出错,而memmove函数即使内存重叠赋值仍然正确进行。
1.4
1.3中的两点在我们模拟实现两函数时得到了诠释,然而当我们在不同编译器下使用memcpy函数时有可能内存重叠赋值仍未出错,这可能是由于编译器优化了memcpy函数功能,初学者不必过于纠结。
2.库函数memcpy与memmove:
memcpy:
#include<stdio.h>
#include<string.h>
int main()
{int arr[]={1,2,3,4,5,6,7,8,9,10};memcpy(arr+3,arr,17);for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++){printf("%d ",arr[i]);}return 0;
}
由于函数以字节为操作单位且该编译器为小端存储,故数字8被赋值为数字5.
memmove:
#include<stdio.h>
#include<string.h>
int main()
{int arr[10]={1,2,3,4,5,6,7,8,9,10};memmove(arr+3,arr,20);for(int i=0;i<10;i++){printf("%d ",arr[i]);}return 0;
}
3.1模拟实现memcpy:
1.内存存在重叠:
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest,const void* src, size_t count)
{assert(dest && src);char *p=(char*)dest;while(count--){*(char*)dest = *(char*)src;dest = (char*)dest+1;src = (char*)src+1;}
}
int main()
{int arr[10]={1,2,3,4,5,6,7,8,9,10};my_memcpy(arr+3,arr,20);for(int i=0;i<10;i++){printf("%d ",arr[i]);}return 0;
}
拷贝出错:
原理:1 2 3 4 5 | 6 7 8 9 10 ->1 2 3 1 2 | 3 7 8 9 10 -> 1 2 3 1 2 | 3 1 2 9 10
内存无重叠:(这里的无重叠是指src+count不小于dest而非没用重叠部分)
#include<stdio.h>
#include<assert.h>
void* my_memcpy(void* dest,const void* src, size_t count)
{assert(dest && src);char *p=(char*)dest;while(count--){*(char*)dest = *(char*)src;dest = (char*)dest+1;src = (char*)src+1;}
}
int main()
{int arr[10]={1,2,3,4,5,6,7,8,9,10};my_memcpy(arr,arr+3,20);for(int i=0;i<10;i++){printf("%d ",arr[i]);}return 0;
}
拷贝正确:
3.2模拟实现memmove:
#include<stdio.h>
#include<string.h>
#include<assert.h>void* my_memmove(void* dest,const void* src, size_t count)
{assert(dest && src);char * ret = (char*) dest;if(dest<src){while(count--){*(char*)dest = *(char*)(src);}}else{while(count--){*((char*)dest+count) = *((char*)src+count);}}return ret;
}
int main()
{int arr[10]={1,2,3,4,5,6,7,8,9,10};my_memmove(arr+3,arr,20);for(int i=0;i<10;i++){printf("%d ",arr[i]);}return 0;
}
当原地址大于目标地址时从前向后拷贝,否则从后向前拷贝即可防止内存覆盖导致拷贝出错,模拟实现memmove函数功能。
memcpy函数与memmove函数相关推荐
- C语言memcpy函数和memmove函数
memcpy函数和memmove函数都是C语言的库函数,作用都是从一个空间copy一定长度的内容到另一个空间,不同的是memcpy只是单纯的拷贝,当两个空间发生局部重叠时无法保证拷贝的正确(正不正确取 ...
- 用C语言模拟实现memcpy函数,memmove函数
一. memcpy函数 void * memcpy ( void * destination, const void * source, size_t num ); 复制内存块 将num字节的值从源指 ...
- 十一.字符串函数与内存函数
目录 一.求字符串长度 二.长度不受限制的字符串函数 1.strcpy函数 2.strcat函数 3.strcmp函数 三.长度受限制的字符串函数 1.strncpy函数 2.strncat函数 3. ...
- C语言学习笔记---数据拷贝函数memcpy()和memmove()函数
在C语言中拷贝字符串的时候通常可以使用strcpy()函数和strncpy()函数,这两个函数是专门针对字符串拷贝的.如果想要拷贝其他类型数组的话,可以使用memcpy()和memmove()函数 ...
- 详解memcpy和memmove函数的使用
作者:~小明学编程 文章专栏:C语言基础知识 格言:目之所及皆为回忆,心之所想皆为过往 目录 memcpy 什么是memcpy? memcpy与strcpy的区别 memcpy 模拟实现memcpy ...
- memcpy和memmove函数的区别
文章目录 前言 memcpy函数 memmove函数 memcmp函数 前言 c语言<string.h>库里面有很多的字符函数,比如memcpy,memmove,memcmp等,这些函数是 ...
- 如何用C语言实现各种字符函数和字符串函数strstr、memcpy、memmove、strlen、strcpy、strcmp、strcat
用C语言模拟实现字符函数与字符串函数 strstr.memcpy.memmove.strlen.strcpy.strcmp.strcat 若使用本文相关代码,还请动手点个赞!!! #define _C ...
- C和指针之memmove函数 memcpy函数 strcspn函数 strspn函数 strrstr函数实现
1 memmove函数的实现 #include <stdio.h> #include <string.h>void* my_memmove(void*dest, const ...
- 随想录(用memmove函数代替strncpy函数)
[声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 有过C语言编程的朋友应该都有过指针越界的困扰.不管越界的地方是全局地址.还是局部地址,查起来都是 ...
最新文章
- OpenCV4中的非典型深度学习模型
- mxnet根据相似度进行人脸样本对图片清理
- Mysql8.0.16 only_full_group_by
- 正则表达式基本语法元字符
- docker add-host hostAliases配置/etc/hosts
- centos7扩展根分区
- linux里工作目录的字体变蓝,netterm访问Linux时字体和背景颜色随目录发生改变的问题解决...
- 日均万亿条数据如何处理?爱奇艺实时计算平台这样做
- 软件测试实践报告文档,软件测试实践报告.doc
- python操作内置Sqlite数据库
- SQL中到底要不要用WHERE 1=1
- Unity3D游戏框架设计
- 计算机术语BOOTP,bootp是什么意思?
- 【服务器数据恢复】EMC Isilon存储误删除的数据恢复案例
- 多糖类水凝胶构建制备介绍(瑞禧多糖水凝胶简述)
- [Android]天气App 1
- 从Hadoop到Spark和Flink,大数据处理框架十年激荡发展史
- 『推箱子』苏晓辉の转专业面试作品 · 纪念品
- python01python的基础知识点(一)
- Boxes Packing