memmove、memcpy、strcpy、memset的实现
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的实现的更多相关文章
- 9. memcpy() memccpy() memmove() strcpy() memset()
部分参考: http://www.cppblog.com/kang/archive/2009/04/05/78984.html 表头文件: #include <string.h>定义函数: ...
- C的memset,memcpy,strcpy 的区别 及memset memcpy memmove源码
extern void *memcpy(void *dest,void *src,unsigned int count);#include <string.h> 功能:由src所指内存 ...
- memset,memcpy,memmove,strcpy,strcat,strcmp的实现(其实很简单,每个程序都只有几行代码)
面试中的几个小问题 1.对stl中list封装(参考1): 2.对重要C函数实现(参考2): //memset void *memset(void *buffer, int c, int count) ...
- strcpy、memcpy和memset的区别
strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#include <string.h> 功能:把src所指由NULL结束的字 ...
- 内存操作函数memmove,memcpy,memset
通过字符串的学习,我们知道字符串操作函数的操作对象是字符串,并且它的结束标志是结束符\0,当然这个说的是不 受限制的字符串函数.然而当我们想要将一段内存的数据复制到另一块内存时,我们不能使用字符串操作 ...
- strcpy、memcpy和memset之间的区别
今天刷题时遇到了这个问题,记录一下. strcpy比较简单,就是拷贝字符串,遇到'\0'时结束拷贝. memcpy用来做内存拷贝,可以拷贝任何数据类型的对象并指定拷贝数据的长度:char a[100] ...
- memset,memcpy,strcpy的使用与区别
1.memset 原型: extern void *memset(void *buffer, int c, int count); 功能: 把buffer所指内存区域的前count个字节设置成 ...
- 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 ...
- C-基础:memcpy、memset、memmove、memcmp、memchr
一,原型 void * memcpy ( void * destination, const void * source, size_t num ); 功能:将以source作为起始地址的数据复制nu ...
- 重写strstr、strcpy、memcpy、memset、atof算法
#include<stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> ...
随机推荐
- Redis 配置节
Redis 后面的配置基于4.0.9版本=>>>不指定版本信息的配置说明都是耍流氓 比如在4.0.9中没有vm相关的及glueoutputbuf的配置信息 部分常用配置节(后面有详细 ...
- Session的作用和使用场景
1.session何时被创建? 客户首次访问服务器时,回话session对象被创建并分配一个唯一的Id,同时id号发送到客户端,并存入cookie,使得客户端session对象和服务器端一致. 2.如 ...
- jQuery:总体掌握
链式编程....方法多,属性无法得到对象进行链式.vs10自动完成.书籍锋利的jQuery vsdoc有智能提示开发时候用,开发完之后,换成min压缩版的. 经验:打开网站文件夹.可以把vs网站上的解 ...
- [图解tensorflow源码] 入门准备工作
tensorflow使用了自动化构建工具bazel.脚本语言调用c或cpp的包裹工具swig.使用EIGEN作为矩阵处理工具.Nvidia-cuBLAS GPU加速计算库.结构化数据存储格式prot ...
- oracle ITL(事务槽)的理解
一.ITL描述: ITL(Interested Transaction List)是Oracle数 据块内部的一个组成部分,位于数据块头(block header),itl由xid,uba,flag, ...
- Hive—学习笔记(一)
主要内容: 1.Hive的基本工能机制和概念 2.hive的安装和基本使用 3.HQL 4.hive的脚本化运行使用方式 5.hive的基本语法--建表语法 6.hive的基本语法--内部表和外部表. ...
- 1、JDK自带注解
1.何为注解? 概念:注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量. ...
- 2014年可用的TRACKER服务器大全
udp://tracker.openbittorrent.com:80/announceudp://tracker.publicbt.com:80/announcehttp://pubt.net:27 ...
- STL容器的常用用法
STL: 1.vector: vector<int> v;vector<int> v(10);//定义大小为10的int型向量容器.vector<int> v(10 ...
- python的协程和异步io【select|poll|epoll】
协程又叫做微线程,协程是一种用户态的轻量级的线程,操作系统根本就不知道协程的存在,完全由用户来控制,协程拥有自己的的寄存器的上下文和栈,协程调度切换时,将寄存器上下文和栈保存到其他地方,在切换回来后, ...