C语言中memmove和memcpy
1、memmove()函数
void *memmove(void *str1, const void *str2, size_t n);
将str2所指向的存储区的前n个字节复制到str1所指向的存储区。
memmove()允许“str1和str2所指向的存储区重叠”。通过检查地址关系,自动选择复制方向(从前往后或从后往前),确保数据复制的正确性。
注意:
1)、str1所指向的存储区必须至少有n个字节,否则,会引起内存溢出。
2)、当“str1和str2所指向的存储区重叠”时,memmove()要比memcpy()能执行正确的拷贝。如果“str1和str2所指向的存储区不重叠”,则memmove()和memcpy()拷贝的效果是一样的。
2、memmove复制浮点数
#include "string.h" //memmove()需要包含string.h头文件
void Test_memmove(void)
{
float buf1[10]={1.1,2.2,3.3,4.4,5.5,6.6,7.7,8.8,9.9,10.5};
//声明浮点数数组buf1[],并初始化
float buf2[10]={1.5,2.5,3.5,4.5,5.5};//声明浮点数数组buf2[],并初始化
memset(buf1,'\0',sizeof(buf1));//将buf1[]设置为0
memmove(buf1,buf2,5*sizeof(float));
//将buf2[]中的前5个浮点数拷贝到buf1[]中
}
3、C语言中memmove和memcpy的区别
#include "string.h" //strcpy(),memcpy()和memmove()需要包含string.h头文件
void Test_memmove(void)
{
char buf[11];
//声明char型数组buf[]
strcpy(buf,"abcdefg");
memcpy(&buf[1], &buf[0], 9);
//将"abcdefg\0\0"拷贝到起始的地址为&buf[1]中的存储单元中
printf("%s\r\n",&buf[1]);//串口输出"abcddfg",出现拷贝错误
strcpy(buf,"abcdefg");
memmove(&buf[1], &buf[0],9);
//将"abcdefg\0\0"拷贝到起始的地址为&buf[1]中的存储单元中
printf("%s\r\n",&buf[1]);//串口输出"abcdefg",拷贝正确
//通过比较,我们发现dest>src,发现memcpy()有问题,而memmove()执行了正确的拷贝
strcpy(buf,"abcdefg");
memcpy(&buf[0], &buf[1], 9);
//将"bcdefg\0\0\0"拷贝到起始的地址为&buf[1]中的存储单元中
printf("%s\r\n",&buf[0]);//串口输出"bcdefg",拷贝正确
strcpy(buf,"abcdefg");
memmove(&buf[0], &buf[1],9);
//将"bcdefg\0\0\0"拷贝到起始的地址为&buf[1]中的存储单元中
printf("%s\r\n",&buf[0]);//串口输出"bcdefg"
//通过比较,我们发现dest<=src,发现memcpy()和memmove()均能执行正确的拷贝
}