内存操作函数memcpy、memmove

来源:互联网 发布:手机如何切换软件 编辑:程序博客网 时间:2024/05/19 02:24

1.模拟实现memcpy

  函数memcpy与类型无关,按字节进行拷贝
  •函数memcpy从src的位置开始向后复制num个字节的数据到dest的内存位置
  •这个函数在遇到’\0’的时候并不会停下来
  •如果src和dest有任何的重叠,复制的结果都是未定义的
以下是模拟实现memcpy函数:

#include <stdio.h>#include <windows.h>#include <assert.h>void *my_memcpy(void *dest,const void *src, int count){    assert(dest);    assert(src);    assert(count > 0);    char *p = (char *)dest;    char *q = (char *)src;    while (count--)    {        *p++ = *q++;    }    return dest;}int main(){    char arr[] = "abcdefg";    char buff[10];    my_memcpy(buff,arr,sizeof(arr));    printf("buff = %s\n", buff);    system("pause");    return 0;}

结果如下:

结果

2.模拟实现memmove

  •和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的
  •如果源空间和目标空间出现重叠,就得使用memmove函数处理
以下是模拟实现memmove函数:

#include <stdio.h>#include <windows.h>#include <assert.h>#include <string.h>void *my_memmove(void *dest,const void *src, int size){    assert(dest);    assert(src);    //从右往左拷贝    char *p = (char *)dest;    char *q = (char *)src;    if ((char *)dest > (char *)src && (char *)dest < (char *)src + size)    {        p = p + size - 1;      //指针指向最后一个元素        q = q + size - 1;        while (size--)        {            *p-- = *q--;        }    }    //从左往右拷贝    else    {        while (size--)        {            *p++ = *q++;        }    }    return dest;}int main(){    char arr[20] = "abcdefg";    my_memmove(arr + 1, arr, strlen(arr) + 1);    printf("after arr = %s\n", arr);    system("pause");    return 0;}

结果如下:

结果