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空间中了。


原创粉丝点击