C++学习小记(memcpy、memmove、memccpy以及memset)
2013-05-09 23:42
417 查看
在 <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空间中了。
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/C++学习笔记】memmove()、memcpy()、memccpy()、strcpy()函数整理
- C/C++ memset的作用以及memcpy和strcpy的区别
- 内存操作函数memcpy,memccpy,memmove,memchr,memcmp,memicmp,memset
- memset、memcpy、memmove的常见用法和区别,以及memcpy与strcpy的区别
- 内存操作函数memcpy,memccpy,memmove,memchr,memcmp,memicmp,memset
- memccpy,memmove,memcpy,memset ,menchr,memcmp,memicmp使用
- 41.内存函数实现(memcpy,memset,memmove,memicmp,memchr.memccpy)
- memmove(),memcopy(),memset()对std::string的影响,以及它们在c/c++中正确的使用方法。
- memset,memcpy,strcpy,memmove,memccpy
- memset(),memmove(),memcpy(),memccpy()
- memset(),memcpy(),memccpy(),memmove(),bcopy(),strcpy(),strncpy()
- 9. memcpy() memccpy() memmove() strcpy() memset()
- C/C++:strcpy-strcnpy-memcpy-memmove
- C++ 中使用memset和memcpy 对字符串和字符串数组处理
- strcpy()、memcpy()、memmove()、memset()的实现
- C语言 strcpy,memcpy,memmove,memccpy函数
- bcopy,memccpy,memcpy,memmove,strcpy,strncpy的异同
- Bada学习- C++以及Flash应用开发流程之概述
- C++学习的方法以及四大名著
- strcpy()、memcpy()、memmove()、memset()及其应用