模拟实现memcpy 与 memmove
2.memcpy内存处理函数:不涉及'\0',需要包含头文件 string.h
3.source的内存不能超过destination的内存大小
4.存在缓冲区的重合问题,要保证destination指向有效的区域:可以用从右往左拷贝的方法
//memmove可以解决mencoy的缓冲区重合的问题
#include<stdio.h>
#include<assert.h>
void Memcpy(void* destination, const void* source, size_t num)
{
assert(destination != );
assert(source != );
char* dest = (char*)destination;
char* sour = (char*)source;
for (size_t i = ; i < num; i++)
{
dest[i] = sour[i];
}
return destination;
}
void Memmove(void* destination, const char* source, size_t num)
{
assert(destination != );
assert(source != );
char* dest = (char*)destination;
char* sour = (char*)source;
//两种情况:
if (sour<dest&&sour + num>dest)
{
//1.缓冲区重合就从后往前拷贝
for (int i = num - ; i >= ; --i)
{
dest[i] = source[i];
}
}
else
{
//2.缓冲区没重合,代码和memcpy一样
Memcpy(destination, source, num);
}
}
int main()
{
int arr1[] = { ,,, };
int arr2[] = { };
Memcpy(arr2, arr1, sizeof(arr1));
for (int i = ; i < sizeof(arr1) / sizeof(int); i++)
{
printf("%d",arr2[i]);
}
return ;
}
模拟实现memcpy 与 memmove的更多相关文章
- memcpy vs memmove
[本文连接] http://www.cnblogs.com/hellogiser/p/memcpy_vs_memmove.html [分析] memcpy与memmove的目的都是将N个字节的源内存地 ...
- memcpy与memmove的区别
在面试中经常会被问道memcpy与memove有什么区别? 整理如下: 其实主要在考C的关键字:restrict C库中有两个函数可以从一个位置把字节复制到另一个位置.在C99标准下,它们的原型如下: ...
- C语言实现memcpy和memmove
0.两者比较: memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中.但复制后src内容会被 ...
- memcpy、memmove、memset及strcpy函数实现和理解
memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h> ...
- 关于memcpy和memmove的一点说明
今天看到书上降到memcpy和memmove的区别才突然发现原来两者之间有如此区别,以前只知道这两个函数是 实现同样的功能,没有接触到其不同. memcpy和memmove在MSDN的定义如下: 从两 ...
- strcpy()、memcpy()、memmove()、memset()的内部实现
一直想知道 strcpy().memcpy().memmove().memset()的内部实现 strcpy(), 字符串拷贝. char *strcpy(char *strDest, const c ...
- 第 16 章 C 预处理器和 C 库(string.h 库中的 memcpy() 和 memmove())
/*----------------------------------------- mems.c -- 使用 memcpy() 和 memmove() ---------------------- ...
- memcpy、memmove、memset、memchr、memcmp、strstr详解
第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,m ...
- C/C++之Memcpy and memmove
memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中. 但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开 ...
随机推荐
- 50个常用的Linux命令
1.tar tar -xvf archive_name.tar 解压文件 tar -cvf archive_name.tar file 把文件file压缩成archive_name.tar tar ...
- UFT测试本地应用程序登陆小实例(描述性编程)
Dim username,password Dim casecount,i Dim currentid DataTable.ImportSheet ,"Action1" casec ...
- Centos7扩展存储空间
1.在关机状态下,在Vm里面设置系统大小到需要的数值 :2.使用root权限登陆linux,df -h查看系统情况: [root@cratedb-hk-01 ~]# df -h 文件系统 容量 已用 ...
- Oracle中把一张表查询结果插入到另一张表中
1. 新增一个表,通过另一个表的结构和数据 create table XTHAME.tab1 as select * from DSKNOW.COMBDVERSION 2. 如果表存在: inse ...
- 转-Asynchronous bulk transfer using libusb
https://falsinsoft.blogspot.jp/2015/02/asynchronous-bulk-transfer-using-libusb.html The 'linusb' is ...
- shell脚本实例-安装httpd,安装yum源
1.安装httpd #!/usr/bin/bash getway=192.168.1.1 ping -c1 www.baidu.com &>/dev/null if [ $? -eq 0 ...
- centos7设置默认的内核启动
centos内核启动时会有3个选项,只有一个可以正常登陆到图形界面的桌面: 下面是设置默认内核的顺序: centos的内核文件在/boot/grub2目录下 1.如果想要修改以上三项的显示顺序,只需要 ...
- js编写轮播图,广告弹框
1.轮播图 js编写轮播图,需要用到setInterval(计时器):先给一个div,里面放轮播图的图片,将轮播图的图片明明为相同样式的:如:banner1.jpg,banner2.jpg,banne ...
- busybox 安装问题解决
直接编译错误 1.loginutils/passwd.c:93:16: error: storage size of ‘rlimit_fsize’ isn’t known 解决方法:在busybox根 ...
- Python之路PythonThread,第一篇,进程1
python3 进程1 多任务编程: 可以有效的利用计算机资源,同时执行多个任务, 进程:进程就是程序在计算机中一次执行的结果: 进程和程序的区别: 程序是一个静态文件的描述,不占用计算机的系统资源: ...