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> ...
随机推荐
- VBA 禁止保存
禁止保存 在workbook事件中 Private Sub Workbook_BeforeClose(Cancel As Boolean) Me.Saved = TrueEnd Sub Priv ...
- 使用VB.Net Express版本创建服务
Services Part 1:> Creating Services Visual Basic Express is a great, free tool from Microsoft. ...
- Posting JSON to Spring MVC Controller
Spring MVC can be setup to automatically bind incoming JSON string into a Java object. Firstly, ensu ...
- 前端开发-5-HTML-总结
1.总体 资源:https://www.processon.com/view/link/5ad1c2d0e4b0b74a6dd64f3c html head标签 title 显示网站的标题 meta ...
- 16 python xml模块
1.基本概念 xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单. 不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀. 至今很多传统公司如金 ...
- 数据恢复软件extundelete介绍
linux下文件系统一般由文件名.Inode.Block三部分组成.当一个用户在Linux系统中试图访问一个文件时,系统会先根据文件名去查找它的inode,看该用户是否具有访问这个文件的权限.如果有, ...
- 系统批量运维管理器pexpect的使用
# pip install pexpect 或 # easy_install pexpect 1 #!/usr/bin/env python 2 import pexpect 3 child = pe ...
- UGUI 实例预制对象位置不对
public static Object Instantiate(Object original, Transform parent, bool instantiateInWorldSpace); / ...
- 逻辑斯蒂回归VS决策树VS随机森林
LR 与SVM 不同 1.logistic regression适合需要得到一个分类概率的场景,SVM则没有分类概率 2.LR其实同样可以使用kernel,但是LR没有support vector在计 ...
- Extending Conductor
后端 导体提供了可插拔的后端.目前的实现使用Dynomite. 每个后端需要实现4个接口: //Store for workflow and task definitions com.netflix. ...