现在的位置: 首页 > 综合 > 正文

memmove

2018年03月16日 ⁄ 综合 ⁄ 共 4215字 ⁄ 字号 评论关闭

相关函数: bcopy(), memccpy()memcpy(),
strcpy(), strncpy()
表头文件: #include <string.h>
定义函数: void *memmove(void *dest, const void *src, size_t n);
函数说明: memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是,当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些。

返回值: 返回指向dest的指针。
附加说明: 指针src和dest所指的内存区域可以重叠。

memcpy()、 memmove()和memccpy()
-------------------------------------------------------
    这三个函数的功能均是将某个内存块复制到另一个内存块。前两个函数的区别在于它们处理内存区域重叠(overlapping)的方式不同。第三三个函数的功能也是复制内存,但是如果遇到某个特定值时立即停止复制。
    对于库函数来说,由于没有办法知道传递给他的内存区域的情况,所以应该使用memmove()函数。通过这个函数,可以保证不会出现任何内存块重叠问题。而对于应用程序来说,因为代码“知道”两个内存块不会重叠,所以可以安全地使用memcpy()函数。

-------------------------------------------------------
#include <string.h>
#include <stdio.h>

int main()
{
    char s[] = "zengxiaolong";

    memmove(s, s+4, strlen(s)-4);
    s[strlen(s)-4] = '\0';
    printf("*s = %s\n", s);

    return 0;
}

贴个VC下的源码看看:
void * __cdecl memmove ( void * dst, const void * src, size_t count )
{
        void * ret = dst;

        if (dst <= src || (char *)dst >= ((char *)src + count)) {
                /*
                 * Non-Overlapping Buffers
                 * copy from lower addresses to higher addresses
                 */
                while (count--) {
                        *(char *)dst = *(char *)src;
                        dst = (char *)dst + 1;
                        src = (char *)src + 1;
                }
        }
        else {
                /*
                 * Overlapping Buffers
                 * copy from higher addresses to lower addresses
                 */
                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);
}

void * memmove(void * dest,const void *src,size_t count)
{
       char *tmp, *s;

        if (dest <= src) {
                tmp = (char *) dest;
               s = (char *) src;
                while (count--)
                        *tmp++ = *s++;
                }
         else {
                 tmp = (char *) dest + count;
                s = (char *) src + count;
                 while (count--)
                         *--tmp = *--s;
                }

        return dest;
}


                        memmove(拷贝内存内容)

相关函数          bcopy,memccpy,memcpy,strcpy,strncpy

表头文件          #include<string.h>

定义函数          void * memmove(void *dest,const void *src,size_t n);

函数说明          memmove()与memcpy()一样都是用来拷贝src 所指的内存内容前n 个字节到dest 所指

                         的地址上。不同的是,当src 和dest 所指的内存区域重叠时,memmove()仍然可以正确

                         的处理,不过执行效率上会比使用memcpy()略慢些。

返 回 值          返回指向dest 的指针。

附加说明          指针src 和dest 所指的内存区域可以重叠。

*/

#if 1

#include <string>
#include <iostream>
#include <stdio.h>

//using namespace std::cout;    //error C2867: 'std::cout' : is not a namespace
//using namespace std::endl;    //error C2867: 'std::endl' : is not a namespace

using namespace std;


void main()
{
           void *s = "ddddddddd ddddd";
           //char str1[20] = "asdfghjkldasdfghjkl";
           char str1[20] = "asdfghjkldasdf";

           //char str2[20] = '0' ;             //error C2440: 'initializing' : cannot convert from 'const char' to 'char [20]'
           //char str2[20] = {} ;//{0} ;     //error


           char str2[20] = {0} ;             //字符数组初始化为空 char a[4] = {0} ; char a[4] == "0"如果定义一个字符数

                                                        组,却没有初始化,则数组输出乱麻

           //void *memmove(void *,const void *,size_t)

           cout<<"copy from s to str1 "<<endl;

           memmove(str1,s,strlen((char *)s));                      //遇到空格继续 ,字符指针---〉字符数组

           cout<<"str1 is "<<str1<<endl;

           memmove(str2,str1,strlen(str1));                         //字符数组-----〉字符数组

           cout<<"str2 is "<<str2<<endl;

           cout <<"copy from str1 to s ,lenght is strlen(str1) "<<endl;

           //memmove(s,str1,strlen(str1));              //字符数组----〉字符指针 运行时显示工程出现问题,需要关闭
           //memmove(s,(void *)str1,strlen(str1));   //字符数组----〉字符指针 运行时显示工程出现问题,需要关闭

            cout<<"s    is "<<s<<endl;

           cout<<"(char *)s    is "<<(char *)s<<endl;

            //memmove(s,str1,sizeof(str1));

           //cout<<"s    is "<<s<<endl;


}

/*
输出结果:
copy from s to str1
str1 is ddddddddd ddddd
str2 is ddddddddd ddddd
copy from str1 to s ,lenght is strlen(str1)
s    is 0046F0C0
(char *)s    is ddddddddd ddddd

*/

/*
把一个字符数组清空的最快的办法是把他的第一个字符的值设为0。   
也就是   a[0]=0;   
             a[0]='\0';   
            a[0]=NULL;  

如何判断一个字符数组是空数组
char aaa[10];

if((aaa[0]=='\0') || strlen(aaa)==0)
{
     //为空
}

*/

#endif

抱歉!评论已关闭.