为了账号安全,请及时绑定邮箱和手机立即绑定

如图,请教一下关于memcpy()函数

如图,请教一下关于memcpy()函数

慕容3067478 2022-03-17 11:11:21
这个程序说memcpy()函数,当源内存块与目标内存块重叠时,将会覆盖掉原来了数据,我运行的时候没覆盖啊,是可能覆盖吗?一下是运行结果。
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

取决于编译器memcpy实现的方式

一般有三种,从头复制 从尾复制 或者判断复制(等同于memmove)

仿照你的 我写了一个测试程序


char message2[60] = "abcdefghijklmnopqrstuvwxyz";char tmp[60];int main(){    strcpy(tmp, message2);    printf("tmp= \"%s\"\n", tmp);    memcpy(tmp+4, tmp + 16, 10);    printf("memcpy(tmp+4, tmp + 16, 10);> tmp = \"%s\"\n", tmp);    strcpy(tmp, message2);    memcpy(tmp+6, tmp +4, 10);    printf("memcpy(tmp+6, tmp +4, 10);> tmp = \"%s\"\n", tmp);    strcpy(tmp, message2);    memcpy(tmp+4, tmp +6, 10);    printf("memcpy(tmp+4, tmp +6, 10);> tmp = \"%s\"\n", tmp);     }

测试结果如下

tmp= "abcdefghijklmnopqrstuvwxyz"

memcpy(tmp+4, tmp + 16, 10);> tmp = "abcdqrstuvwxyzopqrstuvwxyz"

memcpy(tmp+6, tmp +4, 10);> tmp = "abcdefefefijijmnqrstuvwxyz"

memcpy(tmp+4, tmp +6, 10);> tmp = "abcdghijklmnopopqrstuvwxyz"

可以看到 在memcpy(tmp+6, tmp +4, 10);时出现了覆盖 efefef

说明我的编译器(gcc)在做memcpy的时候使用的是头复制 即从起始地址开始复制

如果这个不出错 而memcpy(tmp+4, tmp +6, 10);出错 那么就是尾复制

都不出错的话 那么就是判断之后智能复制 相当于memmove



查看完整回答
反对 回复 2022-03-23
?
忽然笑

TA贡献1806条经验 获得超5个赞

该例子说明几个问题
1. mem开头的函数基本上都是对内存操作的,
它们不管内存里放的是什么数据,只要给出长度,它们就操作。
不像strcpy、strcmp等函数一定以'\0'结尾,而且是字符。
mem可以操作可见字符、不可见字符、控制字符等,任意数据都可以。
2. memcpy是内存复制函数
原型:
void * memcpy(void *dest, void const *src, unsigned int length);
功能:从src的起始位置复制length个字节到dst的内存起始位置。你可以用这种
方法复制任何类型的值,第3个参数指定复制值的长度(以字节计)。
如果src和dst以任何形式出现了重叠,它的结果是未定义的。
3. memset函数
原型:void * memset(void *a, int val, unsigned int length);
功能:把从a开始的length个字节都设置为值val。
例子:memset(buffer, 0, SIZE);



查看完整回答
反对 回复 2022-03-23
  • 2 回答
  • 0 关注
  • 186 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信