美文网首页
memcpy memmove 函数

memcpy memmove 函数

作者: Mark_Guan | 来源:发表于2018-01-24 21:52 被阅读109次

memcpy函数

函数原型


void *memcpy(void *dest, const void *src, size_t size);

功能:由src指向地址为起始地址的连续 size个字节的数据复制到以dest指向地址为起始地址的内存空间内,函数返回值是 void *,指向拷贝成功的内存地址;

注意:srcdest所指内存区域不能有重叠现象;

Demo:

    char src[1024] = "Hello World";
    //分配内存,同时注意处理'\0'的情况
    char *dest = malloc(sizeof(char)*(strlen(src)+1));
    
    memcpy(dest, src, sizeof(char)*(strlen(src)+1));    
    printf("%s\n",dest);

简单的实现方式:

void * mymemcpy(void *dest , const void *src , size_t size)
{
    //非空校验
    if (dest==NULL|| src == NULL) {
        return NULL;
    }
    //判断内存区域是否有重叠现象
   if (dest > (src+size) || dest < src)
    {
        //备份dest的首地址,让函数返回的指针是从头开始的
        char *pdest = dest;
        const char *psrc  = src;
        while (size-->0) {
            *pdest++ = *psrc++;
        }
        return dest;
    }
    return NULL;
}

memmove函数

函数说明


void *memmove(void *dest, const void *source, size_t size)

函数说明: memmove用于从source拷贝size个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。

memcpy函数假设要复制的内存区域不存在重叠,如果你能确保你进行复制操作的的内存区域没有任何重叠,可以直接用memcpy; 如果你不能保证是否有重叠,为了确保复制的正确性,你必须用memmove

简单的实现方式:

void * mymemmove(void *dest , const void *src , size_t size)
{
    //非空校验
    if (dest==NULL|| src == NULL) {
        return NULL;
    }
    void *psrc = malloc(size);//分配内存
    memcpy(psrc, src, size);  //整体拷贝到临时内存中
    memcpy(dest, psrc, size); //拷贝到目标内存中
    free(psrc);               //释放内存
    return dest;
}

memset函数

函数原型

void *memset(void *dest,int val,size_t size)

功能:将已开辟的内存空间 dest的前 size 个字节的值设为值 val

简单的实现方式:

void * mymemset(void *dest , int val , size_t size)
{
    //非空校验
    if (dest == NULL) {
        return NULL;
    }
    char *pdest = dest;
    while (size--) {
        *pdest++ = val;
    }
    return dest;
}

memchr函数

函数原型

void *memchr(const void *buf, int ch, size_t count);

功能: 从buf所指内存区域的前count个字节查找字符ch,当第一次遇到字符ch时停止查找。如果成功,返回指向字符ch的指针;否则返回NULL。

简单的实现方式:

void *mymemchr(const void *buf, int ch, size_t count)
{
   char *p = NULL;
   for (char *ps = buf; ps < (char *) buf + count; ps++) {
       if (*ps == ch) {
           p = ps;
           break;
       }
   }
   return p;
}

相关文章

  • memcpy memmove 函数

    memcpy函数 函数原型 功能:由src指向地址为起始地址的连续 size个字节的数据复制到以dest指向地址为...

  • memcpy与memmove的区别

    memcpy和memmove都是C语言的库函数,相比于strcpy和strncpy只能拷贝字符串数组,memcpy...

  • memmove 和 memcpy 的区别

    memmove和memcpy都是拷贝,区别是memmove会判断方向,如果有重叠的区域那么memcpy就会有问题 ...

  • 总结:头文件cstring函数的用法(original)

    一.复制类(cpy) (1)memcpy 函数原型: 用法:可与用于转移数据 (2)memmove 函数原型: 基...

  • memset,memcpy,memmove函数

    这三个函数分别实现内存设置,内存拷贝和内存移动 需要包含头文件#include 1.memset函数:内存的值重新...

  • memmove 和 memcpy的区别

      在看Category的源码时碰见了两个C语言函数memmove和memcpy,在string.h中我们可以看见...

  • memmove 和 memcpy的区别

    memcpy和memmove()都是C语言中的库函数,在头文件string.h中,作用是拷贝一定长度的内存的内容,...

  • memset, memcpy and memmove

    memset 函数原型 头文件include 功能将dest所指的内存区域的前size个字节的值全部设置为ch指...

  • memmove与memcpy

    我们知道,分类的方法列表是通过memmove和memcpy加到类的方法列表的前面,而同名的分类方法根据文件的编译顺...

  • memmove和memcpy

    内存移动void *memmove(void *str1, const void *str2, size_t n)...

网友评论

      本文标题:memcpy memmove 函数

      本文链接:https://www.haomeiwen.com/subject/wispaxtx.html