我从c++中读到了关于memcpy和memmove的引用,他们似乎也在做同样的事情,除了memmove有一个特定的想法(允许目标和源重叠)。
什么是重叠,什么时候发生?
发布于 2013-12-22 02:19:44
这很简单。考虑一下memmove(dest, source, length)。
如果由source到source + length - 1指定的字节范围包括dest到dest + length - 1指定范围内的任何字节,则两个范围重叠。
在数组中移动元素时,最有可能发生这种情况。示例:
// Slide array down by one:
char array[N];
memmove( (void*) &array[0], (void*) &array[1], N - 1 );这与元素1到N-2重叠。滑动另一个方向也有类似的重叠:
// Slide array up by one:
memmove( (void*) &array[1], (void*) &array[0], N - 1 );如果要用memcpy()尝试同样的操作,则生成的行为是未定义的。如果在上述两个示例中都使用memcpy,某些实现将正确工作。如果您在这里使用memcpy而不是memmove,那么其中一个或两者都会失败。这是C和C++在范围重叠时为memcpy()保留未定义行为的结果。
https://stackoverflow.com/questions/20725573
复制相似问题