C语言中memmove和memcpy

1、memmove()函数

void *memmove(void *str1, const void *str2, size_t n);

str2所指向的存储区的前n个字节复制到str1所指向的存储区

memmove()允许str1str2所指向的存储区重叠”。通过检查地址关系,自动选择复制方向(从前往后或从后往前),确保数据复制的正确性。

注意:

1)、str1所指向的存储区必须至少有n个字节,否则,会引起内存溢出。

2)、当“str1str2所指向的存储区重叠”时,memmove()要比memcpy()能执行正确的拷贝。如果“str1str2所指向的存储区不重叠”,则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()均能执行正确的拷贝

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值