查看: 70|回复: 7
收起左侧

程序开发中memcpy函数应用探讨

[复制链接]

86

主题

3850

帖子

1万

积分

资深工程师

 楼主| 发表于 2017-11-30 18:32 | 显示全部楼层 |返回版面|阅读模式
如题,,在程序开发中,这个函数恐怕是应用的比较多的了,,其主要用于内存数据的拷贝的,用度娘的,,其定义很清楚的——memcpy指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
后来乍到,前辈们多多包涵了啊。。

86

主题

3850

帖子

1万

积分

资深工程师

 楼主| 发表于 2017-11-30 18:33 | 显示全部楼层 |返回版面
函数原型

void *memcpy(void *dest, const void *src, size_t n);,,是不是很熟悉的?但是每次总是会吧原地址与目标地址的搞混的,,,why??
后来乍到,前辈们多多包涵了啊。。

86

主题

3850

帖子

1万

积分

资深工程师

 楼主| 发表于 2017-11-30 18:35 | 显示全部楼层 |返回版面
所需头文件

C语言:#include<string.h>

C++:#include<cstring>
函数返回指向dest的指针——这个需要注意的,,返回的是dest的指针,也就是第一个参数的,第二个参数是原地址的
后来乍到,前辈们多多包涵了啊。。

86

主题

3850

帖子

1万

积分

资深工程师

 楼主| 发表于 2017-11-30 18:36 | 显示全部楼层 |返回版面
重要说明——

1.source和destin所指的内存区域可能重叠,但是如果source和destin所指的内存区域重叠,那么这个函数并不能够确保source所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向destin的指针.

2.如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。

注意:source和destin都不一定是数组,任意的可读写的空间均可。
后来乍到,前辈们多多包涵了啊。。

86

主题

3850

帖子

1万

积分

资深工程师

 楼主| 发表于 2017-11-30 18:38 | 显示全部楼层 |返回版面
我们在进行程序开发中,还会见到另一个相似的数据拷贝函数的——strcpy,,这个跟memcpy又有哪些区别的呢?
简单的查了一下的,大致意思的:strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等;
strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
后来乍到,前辈们多多包涵了啊。。

86

主题

3850

帖子

1万

积分

资深工程师

 楼主| 发表于 2017-11-30 18:39 | 显示全部楼层 |返回版面
大家伙在使用过程中,有更多该方面的经验请共享一下,并讨论的哈
后来乍到,前辈们多多包涵了啊。。

68

主题

3690

帖子

1万

积分

资深工程师

发表于 2017-11-30 20:59 | 显示全部楼层 |返回版面
vivilzb1985 发表于 2017-11-30 18:33
函数原型

void *memcpy(void *dest, const void *src, size_t n);,,是不是很熟悉的?但是每次总是会吧原 ...

这个没啥诀窍的,,直接记住就行了啊

79

主题

3600

帖子

1万

积分

资深工程师

发表于 2017-12-3 22:13 | 显示全部楼层 |返回版面
vivilzb1985 发表于 2017-11-30 18:33
函数原型

void *memcpy(void *dest, const void *src, size_t n);,,是不是很熟悉的?但是每次总是会吧原 ...

这个一般直接使用的即可的啊
您需要登录后才可以回帖 登录 | 注册 手机登录

本版积分规则

分享 快速回复 返回顶部 返回列表