函数原型:

void* memcpy(void *dst,void const *src,size_t count)
void* memmove(void *dst,void const *src,size_t count)

头文件:

#include<string.h>

引入:

  字符串由'\0'结尾,所以字符串内部不能包含任何'\0'字符('\0'的ASCII值为0),否则我们将读不到'\0'后的字符内容。但是,非字符串内部包含零值的情况并不罕见,我们无法利于其它字符串函数来处理这类数据。所以,我们要引入内存操作的函数来处理。

  memcpy

memcpy函数是从src的起始位置复制count个字节到dst内存的起始位置。

我们可以利用这种方法复制任何类型的数值,但是,如果src和dst以任何形式出现了重叠,它的结果就是未定义的。所以,有内存重叠的情况时,我们要避免使用memcpy函数。

//模拟memcpy源码实现
void* my_memcpy(void *dst, void *src, size_t count)
{
assert(dst); //这里最好检测一下源和目的的合法性
assert(src);
char *dest = (char *)dst; //以字节为单位进行复制
char *str = (char *)src;
while (count--)
{
*dest++ = *str++;
}
return dst;
}

  memmove

memmove函数和memcpy函数差不多,只是它的源和目标操作数可以重叠。

//模拟memmove源码实现
void* my_memove(void *dst, void *src, size_t count)
{
assert(dst);
assert(src);
char *dest = (char *)dst;
char *str = (char *)src; if ((dest > str) && (dest < str + count))
{ // 内存重叠,从后往前拷贝
dest = dest + count - 1;
src = src + count - 1; while (count--)
{
*dest-- = *str--;
}
}
else
{ //内存不重叠,相当于memcpy
while (count--)
{
*dest++ = *str++;
}
}
return dst;
}

  

memcpy与memmove的更多相关文章

  1. memcpy vs memmove

    [本文连接] http://www.cnblogs.com/hellogiser/p/memcpy_vs_memmove.html [分析] memcpy与memmove的目的都是将N个字节的源内存地 ...

  2. memcpy与memmove的区别

    在面试中经常会被问道memcpy与memove有什么区别? 整理如下: 其实主要在考C的关键字:restrict C库中有两个函数可以从一个位置把字节复制到另一个位置.在C99标准下,它们的原型如下: ...

  3. C语言实现memcpy和memmove

    0.两者比较: memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中.但复制后src内容会被 ...

  4. memcpy、memmove、memset及strcpy函数实现和理解

    memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h> ...

  5. 关于memcpy和memmove的一点说明

    今天看到书上降到memcpy和memmove的区别才突然发现原来两者之间有如此区别,以前只知道这两个函数是 实现同样的功能,没有接触到其不同. memcpy和memmove在MSDN的定义如下: 从两 ...

  6. strcpy()、memcpy()、memmove()、memset()的内部实现

    一直想知道 strcpy().memcpy().memmove().memset()的内部实现 strcpy(), 字符串拷贝. char *strcpy(char *strDest, const c ...

  7. 第 16 章 C 预处理器和 C 库(string.h 库中的 memcpy() 和 memmove())

    /*----------------------------------------- mems.c -- 使用 memcpy() 和 memmove() ---------------------- ...

  8. 模拟实现memcpy 与 memmove

    模拟实现memcpy 与 memmove 1.str系列的函数只能处理字符串——>必须带有'\0'2.memcpy内存处理函数:不涉及'\0',需要包含头文件 string.h3.source的 ...

  9. memcpy、memmove、memset、memchr、memcmp、strstr详解

    第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,m ...

  10. C/C++之Memcpy and memmove

    memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中. 但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开 ...

随机推荐

  1. Sping 的 BeanFactory 容器

    Sping 的 BeanFactory 容器 这是一个最简单的容器,它主要的功能是为依赖注入 (DI) 提供支持,这个容器接口在 org.springframework.beans.factory.B ...

  2. MyBatis实战——自动回复机器人

    案例分析 基本功能 接收发送指令 根据指令自动回复对应内容 模块划分 回复内容维护 对话功能 回复内容列表 回复内容删除 MyBatis的下载和核心架构的搭建 下载地址:https://github. ...

  3. Split Divisibilities (Project Euler 598)

    题目大意: 求将$100!$ 拆成$a*b$的方案数,其中$a<=b$并且它们的约数个数一样多. 思路: 先将$100!$质因数分解, 结果如图: 首先想到一个暴力DP, dp[i][j][k] ...

  4. AndroidHttpClient和HttpEntity详解

    AndroidHttpClient结构: public final class AndroidHttpClient extends Object implements HttpClient 前言:这类 ...

  5. 【转】Visual studio 快捷键大全

    原文:http://book.douban.com/review/4871157/ 可同时参考:http://www.cnblogs.com/TankXiao/p/3164995.html 还记得刚工 ...

  6. Lumen migration(数据库协同)

    建立迁移文件/新建表文件 php artisan make:migration create_users_table 添加字段 php artisan make:migration add_colum ...

  7. [ACM] hdu 3923 Invoker (Poyla计数,高速幂运算,扩展欧几里得或费马小定理)

    Invoker Problem Description On of Vance's favourite hero is Invoker, Kael. As many people knows Kael ...

  8. 第一篇:尽量多的以 const/enum/inline 替代 #define

    前言 在面向过程语言,如 C 语言中,#define 非常常见,也确实好用,值得提倡.但在如今面向对象的语言,如 C++ 语言中,#define 就要尽量少用了. 为何在 C++ 中就要少用了呢? 这 ...

  9. caffe小问题汇总(持续更新)

    PS:所有问题均在caffe-windows下产生 1.为什么AlexNet中,InnerProduct_Layer(fc8)层的输出可以直接作为Accuracy_Layer层的输出? 答:首先,我们 ...

  10. 《从零开始学Swift》学习笔记(Day 52)——Cocoa错误处理模式

    原创文章,欢迎转载.转载请注明:关东升的博客 Swift错误处理模式,在Swift 1.x和Swift 2.0是不同的两种模式. Swift 1.x代码错误处理模式采用Cocoa框架错误处理模式,到现 ...