点击此处查看最新的网赚项目教程
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)一样进行(其实质是比较两块内存的首地址,进行前向或后向复制(移动一下两个指针)),允许目标和源重叠。
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;
#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!
-End-
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: cai842612