首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >memmove()定义中的重叠是什么?

memmove()定义中的重叠是什么?
EN

Stack Overflow用户
提问于 2013-12-22 02:18:05
回答 1查看 8K关注 0票数 8

我从c++中读到了关于memcpymemmove的引用,他们似乎也在做同样的事情,除了memmove有一个特定的想法(允许目标和源重叠)。

什么是重叠,什么时候发生?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-22 02:19:44

这很简单。考虑一下memmove(dest, source, length)

如果由sourcesource + length - 1指定的字节范围包括destdest + length - 1指定范围内的任何字节,则两个范围重叠。

在数组中移动元素时,最有可能发生这种情况。示例:

代码语言:javascript
复制
// Slide array down by one:
char array[N];
memmove( (void*) &array[0], (void*) &array[1], N - 1 );

这与元素1到N-2重叠。滑动另一个方向也有类似的重叠:

代码语言:javascript
复制
// Slide array up by one:
memmove( (void*) &array[1], (void*) &array[0], N - 1 );

如果要用memcpy()尝试同样的操作,则生成的行为是未定义的。如果在上述两个示例中都使用memcpy,某些实现将正确工作。如果您在这里使用memcpy而不是memmove,那么其中一个或两者都会失败。这是C和C++在范围重叠时为memcpy()保留未定义行为的结果。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20725573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档