关于memcpy()函数

这个程序说memcpy()函数,当源内存块与目标内存块重叠时,将会覆盖掉原来了数据,我运行的时候没覆盖啊,是可能覆盖吗?一下是运行结果。... 这个程序说memcpy()函数,当源内存块与目标内存块重叠时,将会覆盖掉原来了数据,我运行的时候没覆盖啊,是可能覆盖吗?一下是运行结果。 展开
 我来答
风若远去何人留
2013-11-29 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450133
专业C/C++软件开发

向TA提问 私信TA
展开全部

取决于编译器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

语恋z
2015-09-30 · TA获得超过199个赞
知道答主
回答量:39
采纳率:100%
帮助的人:10.2万
展开全部
该例子说明几个问题
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);
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式