2016年2月9日 正月初二 晴
以前上课时候老师提到过memcpy memove让大家下去自己尝试着写出代码来,后来不知如何给忘了,今天复习笔记的时候看见了这两个函数,所以花了点时间把它给搞懂。
memcpy 和memove都是c语言中的库函数,在头文件string.h中作用是拷贝一定长度内存的内容,原型分别如下:
void *my_memcpy(void *dest,void *src,size_t count)
void* my_memmove(void *dest, const void *src, size_t count)
其实它们的作用都是一样的,唯一的区别就是当内存发生局部重叠的时候memove保证拷贝的结果是正确的,memcpy 不保证拷贝结果的正确性
「 count 」
���������
� �
Dest src
「count 」
���������
� �
src Dest
第一中情况下拷贝重叠区域不会出现问题,内容均可以正确拷贝。
第二种情况下,问题出现在右边的两个字节,这两个字节原来的内容就会被覆盖掉,而且没有保存,所以接下来拷贝的时候拷贝的是已经覆盖的内容,显然这是有问题的,实际上memove在拷贝两个有重叠区域的内存时可以保证拷贝的正确性,但是memcpy就不行了,但是他也有自己的优点就是运行速度快。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
void* my_memmove(void *dest, void *src, size_t count)
/*size _t 为了增强程序的可移植性,便有了size_t ,
不同系统上,定义size_t可能不一样。
经测试发现,在32位系统中size_t是4字节的,
在64位系统中,size_t是8字节的,
这样利用该类型可以增加程序移植性。*/
{
char* p1=src;
char* p2=dest;
char* ret=NULL;
assert(dest);
assert(src);
//内存重叠时从后开始拷贝
if((p2>p1)&&(p2<p1+count))
{
while(count--)
{
*(p2+count)=*(p1+count);
}
}
//内存不重叠
else
{
while(count--)
{
*p2++=*p1++;
}
}
return ret;
}
void* my_memcpy(void* dest,const void*src,size_t count)
{
char* p1=(char*)src;
char* p2=(char*)dest;
char* ret=NULL;
assert(dest);
assert(src);
while(count--)
{
*p2++=*p1++;
}
}
int main()
{
char str[]="hello world!hello bit!";
my_memmove(str + 2, str , 5);
puts(str);
system("pause");
return 0;
}