首先来看strcpy,目的是实现字符串的复制,这里需要注意几个点:

1.判断指针的有效性

2.将复制后的指针地址返回,为了支持链式操作

3.不要忘记将字符串最后一个自负'\0'复制给dest

4.注意原字符串类型为const,保证在函数内部不会被修改

char* myStrcpy(char* dest, const char* src){
assert(dest!=NULL && src !=NULL);
char* r = dest;
while((*dest++ = *src++)!='\0') ;
return r;
}

然后来看memcpy,目的是实现内存的复制,这里就不仅仅限制于字符串复制,并且规定了复制内存的大小

void* myMemcpy(void* dest, const void* src, size_t n){
assert(dest!=NULL && src !=NULL);
void* r = dest;
while(n--){
*dest++ = *src++;
}
return r;
}

最后来看memmove,实现的功能,与mencpy是一样的,不同的地方在于,其处理了目的内存与原内存重叠的情况。

void* myMemmove(void* dest, const void* src, size_t n){
assert(dest!=NULL&& src!=NULL);
void* r = dest;
if(dest<src || dest>str+n){ //no recover
while(n--){
*dest++ = *src++;
}
}else{ // with recover, copy from end to begin
dest = dest+n;
src = src + n;
while(n--){
*(--dest) = *(--src);
}
}
return r;
}

总体看来,strcpy, memcpy和memmove都是对内存进行复制操作的,不同之处在于,strcpy强调对于字符串的处理,memcpy要给定复制内容的大小,memmove则注意了内存重叠的情况

strcpy, mencpy, memmove三者区别的更多相关文章

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

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

  2. css学习--inline-block详解及dispaly:inline inline-block block 三者区别精要概括

    *知识储备: 内联元素:是不可以控制宽和高.margin等:并且在同一行显示,不换行. 块级元素:是可以控制宽和高.margin等,并且会换行. 1.inline-block 详解 (1)一句话就是在 ...

  3. strcpy与memcpy的区别

    strcpy和memcpy的区别 strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制 ...

  4. C# 总结const、 readonly、 static三者区别:

    总结const. readonly. static三者区别: (有人问我,看似简单,我也没能立刻回答出来,总结一下,分享一下.) const:静态常量,也称编译时常量(compile-time con ...

  5. @ApiParam @PathVariable @RequestParam三者区别

    转载:https://www.cnblogs.com/xu-lei/p/7803062.html @ApiParam @PathVariable @RequestParam三者区别 1.@ApiPar ...

  6. @Requestbody@ApiParam @PathVariable @RequestParam三者区别

    一.问题描述 由于项目是前后端分离,因此后台使用的是spring boot,做成微服务,只暴露接口.接口设计风格为restful的风格,在get请求下,后台接收参数的注解为RequestBody时会报 ...

  7. [转帖]C#中字典集合HashTable、Dictionary、ConcurrentDictionary三者区别

    C#中字典集合HashTable.Dictionary.ConcurrentDictionary三者区别 https://blog.csdn.net/yinghuolsx/article/detail ...

  8. Jquery元素筛选、html()和text()和val三者区别

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. strcpy和memcpy的区别(转载)

    strcpy和memcpy都是标准C库函数,它们有下面的特点.strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符. 已知strcpy函 ...

随机推荐

  1. sql 随机数

    select FLOOR(rand()*16) 就是随机得到0到15之间的一个整数 select CEILING(rand()*15) 就是随机得到1到15之间的一个整数 FLOOR()为地板函数,取 ...

  2. c# 面相对象1-概括

    面向对象和面向过程的区别 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了.  面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为 ...

  3. Spring-----4、使用Spring容器

    转载自:http://blog.csdn.net/hekewangzi/article/details/41349591

  4. 云支付整合Tp3.2.3代码整理

    可能比较少的项目用会用到云支付,我之前有个项目就用这个支付,相对于微信支付和支付宝支付他名气太小了,但是很多支付宝或者微信审核不下来就回选择这种支付方式,总体开发比较简单.云支付官网是这么说的“云支付 ...

  5. 初识ege图形库

    简介: EGE (Easy Graphics Engine),是Windows 下的简易绘图库, 是一个类似BGI (graphics.h)的 面向C/C++语言新手的图形库,对新手来说,简单,友好, ...

  6. onbeforepaste

    onbeforepaste事件用法 onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').rep ...

  7. php 数组 (3) reset() end() count() current() key()

    <?php /* count()统计数组中元素的个数 reset() 把数组内部指针移动到数组第一个元素,并返回元素值 end() 把数组内部指针移动到数组最后一个元素,并返回元素值 prev( ...

  8. div+css树形菜单

    自己做过的项目从来没有这种东西,但见过别人的项目都有,未免落伍,学来看看,也不知道自己找到的这个是不是正路子,先贴代码再分析. <!doctype html public "-//W3 ...

  9. MYSQL 为表指定文件位置 data directory

    背景知识: 如果表不指定文件位置,它会保存到 data/database_name/table_file;其中data在你指定的安装目录下,为了提高IO我们尽可能的 用到多个硬盘的IO能力,这个就需要 ...

  10. MYSQL 查看当前用户与数据库版本

    问题一: 查看当前用户 select user(); 问题二: 查看数据库版本 select version();