当前位置: 首页 > 最新文章 > 正文

C|memcpy()和memmove()的比较及实现

2 区别memcpy():复制内存块,直接复制,因为是直接复制,所以不应重叠,对于重叠的内存块,memmove是一种更安全的方法。memmove():移动内存块,复制就像使用了中间缓冲区一样进行,允许目标和源重叠。其功能是拷贝src所指向内存内容前n个字节到dest所指的地址上。由于数据类型不确定,可以以字符为单位进行拷贝,这是因为字符可以扩展为任何一种数据类型,且每一种数据类型大小都是字符大小的

admin

2 区别memcpy():复制内存块,直接复制,因为是直接复制,所以不应重叠,对于重叠的内存块,memmove是一种更安全的方法。memmove():移动内存块,复制就像使用了中间缓冲区一样进行,允许目标和源重叠。其功能是拷贝src所指向内存内容前n个字节到dest所指的地址上。由于数据类型不确定,可以以字符为单位进行拷贝,这是因为字符可以扩展为任何一种数据类型,且每一种数据类型大小都是字符大小的倍数。";memmove;printf; system;return 0;}// 输出:HellHello World!

memcpy()和memmove()函数的原型如下:

void * memcpy ( void * dst, const void * src, size_t num );

void * memmove ( void * dst, const void * src, size_t num );

1 相同点

1.1 通常函数的参数都有具体的类型,而这里的两个函数的参数和返回值都是void,其实就是内存块(字节序列)的复制或移动(函数名字的mem是memory的缩写),有点泛型的味道,不像字符串拷贝函数,指定的是C风格字符数组类型。

1.2 两者都位于头文件<string.h>中,当然除了字符串的复制,也可以复制其它数据类型,例如整体复制一个结构体(见后面的例子)。

1.3 函数不检查源中是否有任何终止的空字符(terminating null character),它总是精确地复制num字节。

1.4 为了避免溢出(overflows),目标参数和源参数指向的空间至少应为num字节。

2 区别

memcpy():复制内存块(Copy block of memory),直接复制(directly copy),因为是直接复制,所以不应重叠(overlap),对于重叠的内存块,memmove是一种更安全的方法。

memmove():移动内存块(Move block of memory),复制就像使用了中间缓冲区(intermediate buffer)一样进行(其实质是比较两块内存的首地址,进行前向或后向复制(移动一下两个指针)),允许目标和源重叠。

C|memcpy()和memmove()的比较及实现

3 使用实例

3.1 memcpy():

#include <stdio.h>#include <string.h>struct {  char name[40];  int age;} person, person_copy;int main (){  char myname[] = "Pierre de Fermat";  /* using memcpy to copy string: */  memcpy ( person.name, myname, strlen(myname)+1 );  person.age = 46;  /* using memcpy to copy structure: */  memcpy ( &person_copy, &person, sizeof(person) );  printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );  return 0;}// Output: person_copy: Pierre de Fermat, 46

3.2 memmove():

/* memmove example */#include <stdio.h>#include <string.h>int main (){  char str[] = "memmove can be very useful......";  memmove (str+20,str+15,11);  puts (str);  return 0;}// Output:memmove can be very very useful.

4 memmove()的实现

memmove()函数原型:void *memmove(void *dest, const void *src, size_t n)。

其功能是拷贝src所指向内存内容前n个字节到dest所指的地址上。

由于数据类型不确定,可以以字符为单位进行拷贝,这是因为字符可以扩展为任何一种数据类型,且每一种数据类型大小都是字符大小的倍数。

考虑到两块内存重叠的情况,需要考虑以下三点:

(1)当目标内存的首地址等于源内存的首地址时,不进行任何拷贝;

(2)当目标内存的首地址小于源内存的首地址时,正向拷贝,即从src拷贝到src + n;

(3)当目标内存的首地址大于源内存的首地址时,移动指针,反向拷贝,即从src+n反向拷贝到src;

C|memcpy()和memmove()的比较及实现

#include<stdio.h>#include<stdlib.h>#include<string.h>void* memmove(void* dst, const void* src, size_t n){    char* d       = (char*)dst;     // 按字节为单位进行操作    const char *s = (const char*)src;    if (d<s) // 当目标地址在源地址前面时,正向拷贝    {while (n--)            *d++ = *s++;    }    else if (d>s) // 当目标地址在源地址后面时,移动指针,反向拷贝    {        d = d+n-1;        s = s+n-1;        while (n--)*d-- = *s--;    }    return dst;}int main(){char src[100] = "Hello World!";memmove(src + 4, src, strlen(src) + 1);printf("%s",src); system("pause");return 0;}// 输出:HellHello World!


C|memcpy()和memmove()的比较及实现

-End-


上一篇: 「python学习笔记」python decode()方法 下一篇:这样理解MySQL索引,阿里面试官也给你点赞
返回顶部