点击此处查看最新的网赚项目教程

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

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)一样进行(其实质是比较两块内存的首地址,进行前向或后向复制(移动一下两个指针)),允许目标和源重叠。

memcpy函数_memcpy_memcpy函数原型

3 使用实例

3.1 memcpy():

#include 
#include 
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 
#include 
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;

memcpy函数_memcpy函数原型_memcpy

#include
#include
#include
void* memmove(void* dst, const void* src, size_t n)
{
    char* d       = (char*)dst;     // 按字节为单位进行操作
    const char *s = (const char*)src;
	
    if (ds) // 当目标地址在源地址后面时,移动指针,反向拷贝
    {
        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!

memcpy_memcpy函数原型_memcpy函数

-End-

———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: cai842612