模拟实现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能正确地实施拷贝,但这也增加了一点点开 ...
随机推荐
- SQL-31 获取select * from employees对应的执行计划
题目描述 获取select * from employees对应的执行计划 explain select * from employees explain 用于获得表的所有细节
- codeforces546D(从一个数中拆分素数)
D. Soldier and Number Game time limit per test 3 seconds memory limit per test 256 megabytes input s ...
- synchronized(二)
package com.bjsxt.base.sync002;/** * 关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁, * 所以代码中哪个线程先执行synchro ...
- golang切片类型
切片slice 其本身并不是数组,它指向底层的数组 作为变长数组的替代方案,可以关联底层数组的局部或全部 为引用类型 可以直接创建或从底层数组获取生成 使用len()获取元素个数,cap()获取容量 ...
- Vue 项目架构设计与工程化实践
来源 文中会讲述我从0~1搭建一个前后端分离的vue项目详细过程 Feature: 一套很实用的架构设计 通过 cli 工具生成新项目 通过 cli 工具初始化配置文件 编译源码与自动上传CDN Mo ...
- TCCSuperPlayerView让Delphi支持app视频播放!
今天ChinaCock发布了新版,完美支持视频播放!新版本中,发布了新的控件TCCSuperPlayerView,以支持视频播放. 这是一个可视控件,拖放到Form上,调整好大小与位置,就可以调用他的 ...
- mysql基础查询语法
一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.group by子句通常和count( ...
- 2.18 爬页面源码(page_source)
2.18 爬页面源码(page_source) 前言有时候通过元素的属性的查找页面上的某个元素,可能不太好找,这时候可以从源码中爬出想要的信息.selenium的page_source方法可以获取到页 ...
- 又一个opengl教程,多多益善
http://ogldev.atspace.co.uk/index.html http://wiki.jikexueyuan.com/project/modern-opengl-tutorial/tu ...
- 创建文件夹c++
linux #include <sys/types.h> #include <sys/stat.h> string filepath; mkdir(filepath.c_str ...