您的位置:首页 > 编程语言 > C语言/C++

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空间中了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息