memmove、memcpy、strcpy、memset

原型为:

void *memmove( void* dest, const void* src, size_t count );

char* strcpy(char* dest, const char* src);

void *memcpy(void *dest,  const char* src,  size_t count);

void* memset(void* dest, int value, size_t num)。

(1)strcpy提供了字符串的复制。

  即strcpy只用于字符串复制,并且它不仅复制字符串内容外,还会复制字符串的结束符。

(2)memcpy只提供一般的内存复制,即memcpy对于需要复制的内容没有限制,因此用途更广

(3)复制的内容不同。

  strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符串、整型、结构体、类等。

(4)复制的方法不同。

  strcpy不需要指定长度,它遇到被复制字符串的结束符"\0”才结束,所以容易溢出。memcpy则是根据第3个参数决定复制的长度。

(5)用途不同。

  通常在复制字符串时用strcpy,而需要复制其它类型的数据是用memcpy。

(6)memcpy只是memmove的一个子集,memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些。

memcpy的实现:

 //size_t指的是unsigned int
char* memcpy(void* dest,const void* src, size_t num)
{
char* p_dest = (char*)dest;
const char* p_src = (const char*)src;
assert((dest != NULL) && (src != NULL) && (dest != src));
while(num-- > )
*p_dest++ = *p_src++;
return dest;
}

strcpy的实现:

 char* strcpy(char* dest, const char* src)
{
assert((dest!=NULL) && (src!=NULL) && (dest!=src));
char* address = dest;
while(*dest++ = *src++ )
NULL;
return address;
}

memmove的实现:

 char* memmove(void* dest, const void* src,size_t num) {
assert((dest!=NULL) && (src!=NULL) && (dest!=src));
char* p_dest = (char*)dest;
const char* p_src = (const char*)src; if(p_dest > p_src && p_dest < p_src + num) //内存有重叠,逆向拷贝
{
p_dest += num - ;
p_src += num - ;
while(num--)
*p_dest-- = *p_src--;
}
else
{ //p_dest<=p_src,此时无论是否重叠都可以使用正向拷贝
while(num--)
*p_dest++ = *p_src++;
}
return dest;
}

memset的实现:

 char* memset(void* dest, int value, size_t num)
{
assert(dest != NULL);
unsigned char* p_dest = (unsigned char*)dest;
while(num-- > )
*p_dest++ = (unsigned char)value;
return dest;
}

memmove、memcpy、strcpy、memset的实现的更多相关文章

  1. 9. memcpy() memccpy() memmove() strcpy() memset()

    部分参考: http://www.cppblog.com/kang/archive/2009/04/05/78984.html 表头文件: #include <string.h>定义函数: ...

  2. C的memset,memcpy,strcpy 的区别 及memset memcpy memmove源码

    extern void *memcpy(void *dest,void *src,unsigned int count);#include <string.h>   功能:由src所指内存 ...

  3. memset,memcpy,memmove,strcpy,strcat,strcmp的实现(其实很简单,每个程序都只有几行代码)

    面试中的几个小问题 1.对stl中list封装(参考1): 2.对重要C函数实现(参考2): //memset void *memset(void *buffer, int c, int count) ...

  4. strcpy、memcpy和memset的区别

    strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#include <string.h> 功能:把src所指由NULL结束的字 ...

  5. 内存操作函数memmove,memcpy,memset

    通过字符串的学习,我们知道字符串操作函数的操作对象是字符串,并且它的结束标志是结束符\0,当然这个说的是不 受限制的字符串函数.然而当我们想要将一段内存的数据复制到另一块内存时,我们不能使用字符串操作 ...

  6. strcpy、memcpy和memset之间的区别

    今天刷题时遇到了这个问题,记录一下. strcpy比较简单,就是拷贝字符串,遇到'\0'时结束拷贝. memcpy用来做内存拷贝,可以拷贝任何数据类型的对象并指定拷贝数据的长度:char a[100] ...

  7. memset,memcpy,strcpy的使用与区别

    1.memset 原型:   extern void *memset(void *buffer, int c, int count); 功能:   把buffer所指内存区域的前count个字节设置成 ...

  8. strcpy、strncpy、strlen、memcpy、memset、strcat、strncat、strcmp、strncmp,strchr

    1.strcpy #include<stdio.h> #include<assert.h> char *mystrcpy(char *dest, const char *src ...

  9. C-基础:memcpy、memset、memmove、memcmp、memchr

    一,原型 void * memcpy ( void * destination, const void * source, size_t num ); 功能:将以source作为起始地址的数据复制nu ...

  10. 重写strstr、strcpy、memcpy、memset、atof算法

    #include<stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...

随机推荐

  1. Spring声明式事务不回滚问题

    疑问,确实像往常一样在service上添加了注解 @Transactional,为什么查询数据库时还是发现有数据不一致的情况,想想肯定是事务没起作用,出现异常的时候数据没有回滚.于是就对相关代码进行了 ...

  2. css 学习网址

    http://www.divcss5.com/ http://www.divcss5.com/css3/  css3手册 http://www.divcss5.com/shouce/ css手册 ht ...

  3. visual studio 2017 报错 无法下载安装文件。请检查Internet连接,然后重试

    vs下载完离线安装包在无网络环境下点击安装时出现无法下载安装文件.请检查Internet连接,然后重试 原因是证书没有导 解决方法 打开刚刚存放离线文件的路径,比如D:\vs2017offline,然 ...

  4. apiCloud上传头像

    apiCloud上传头像 1.拍照 2.从相机中选择 aui布局 <li class="aui-list-item"> <div class="aui- ...

  5. c++ vector, 迭代器

    现代c++尽量使用vector(容器)和迭代器(相当于指针),少使用数组和指针,除非对程序执行效率有很高的要求. 容器优点,易于扩展,可通过push_back方法动态添加元素,数组不能动态添加元素. ...

  6. 书单BookList

    1. <代码大全> 史蒂夫·迈克康奈尔 (Code Complete) 2. <程序员修炼之道> Andrew Hunt [读过了,非常好的一本书] (Pragmatic Pr ...

  7. 3.3 JSP内置对象概述

    1.request 1.1 request获取页面传来的参数,参数通过浏览器网址和后面添加?的方式传达. 传参:”show.jsp?id=001” 获取参数:request.getParameter( ...

  8. ftp上传下载工具类

    package com.taotao.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNo ...

  9. RN中关于ListView的使用

    1. ListView dataSource 介绍: ListView需要指定数据的来源.传入数据必须是数组,或者是字典里面嵌套数组 系统会根据你传入的数据自动生成section和row 每一个字典的 ...

  10. 结对项目3-bug的三种状态

    这周和小伙伴结对构造程序,来深刻理解软件测试中,bug发现的三种状态. 1:不能触发Fault 2:触发Fault,但是不能触发Error 3:触发Error,但是不能产生Failure 我们完成的代 ...