C++学习小记(memcpy、memmove、memccpy以及memset)
来源:互联网 发布:linux多进程编程 pdf 编辑:程序博客网 时间:2024/05/26 07:29
在 <memory>头文件中,有几个比较有用的函数,这里说明一下:
1. void * memcpy(void * dst, const void * src, size_t count );
memcpy函数的声明如上,作用:将地址从src开始的前count个字节的内容拷贝到地址从dst开始的内存空间中。
返回值:目标空间的起始地址
需要注意的是:dst和src在内存中的位置不能重叠,否则会产生错误。(原因及与memmove函数的区别请往下看)
2. void * memmove(void * dst, const void * src, size_t count);
memmove函数的声明如上,作用同memcpy函数,但是有一点区别,该函数不需要注意dst与src在内存空间上的重叠问题。
返回值:目标空间的起始地址
相对于memcpy函数,该函数效率较慢。
3. void * memccpy(void * dest, const void * src, int c, size_t count);
memccpy函数的声明如上,作用:将地址从src开始的内容拷贝到地址从dest开始的内存空间中,直到拷贝了count个字节或者遇到c对应的字符结束。
返回值:如果将c对应的字符拷贝到dest中则返回dest,否则返回NULL
4. void * memset(void * dst, int val, size_t count);
memset函数声明如上,作用:将地址从dst开始的count个字节都设置为val;可用于将数组和结构清零使用。
说明:memcpy与memmove函数的区别:
memcpy函数的实现:
void * memcpy ( void * dst, const void * src, size_t count ){ void * ret = dst; while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } return(ret);}由实现可知, memcpy函数是正向拷贝的。所以如果src和dst有地址上的重叠,就会在内容上覆盖,拷贝的内容就会出现错误。
memmove函数的实现:
void * __cdecl memmove ( void * dst, const void * src, size_t count ){ void * ret = dst; if (dst <= src || (char *)dst >= ((char *)src + count)) { while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } } else { dst = (char *)dst + count - 1; src = (char *)src + count - 1; while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst - 1; src = (char *)src - 1; } } return(ret);}
由实现可知,memmove函数在count字节范围内如果src和dst地址上没有重叠,则采用正向拷贝;
否则,采用从count字节处开始的逆向拷贝,这样就不会拷贝错误的内容到dst空间中了。
- C++学习小记(memcpy、memmove、memccpy以及memset)
- memset(),memmove(),memcpy(),memccpy()
- memset,memcpy,strcpy,memmove,memccpy
- C语言中memset-memcpy(memmove memccpy)-strcpy函数源代码
- memset(),memcpy(),memccpy(),memmove(),bcopy(),strcpy(),strncpy()
- 【C/C++学习笔记】memmove()、memcpy()、memccpy()、strcpy()函数整理
- strcpy、memset、memmove、memcpy和memccpy函数的使用
- 内存操作函数memcpy,memccpy,memmove,memchr,memcmp,memicmp,memset
- 内存操作函数memcpy,memccpy,memmove,memchr,memcmp,memicmp,memset
- memcpy,memccpy,memmove函数
- memcpy() memmove()和memccpy()
- memcpy() memmove() memccpy()
- memcpy,memccpy,memmove函数
- memcpy()、 memmove()和memccpy()
- memcpy,memccpy,memmove函数
- memmove、memccpy和memcpy
- memmove、memcpy和memccpy区别
- memmove、memcpy和memccpy简介
- c++中预处理变量的作用
- python3.2从网络中下载一张图片
- Linux socket 的一个小例子
- 新旺铺+模板
- 路,还是要一步一步走
- C++学习小记(memcpy、memmove、memccpy以及memset)
- Android开发路上的快速学习之道
- C++ string类简单实现
- IOS开发-注册定制的URL模式
- 【违规举报】违规举报方法步骤
- 提升自己的学习能力
- 敏捷开发产品管理系列之一:序言及设立迭代目标
- App安全领域未被重视
- c# 通过反射属性, 把源对象写入目标对象