Skip to content

std::memmove

cppreference std::memmove

Implementation

nowcoder

补充下面函数代码: 如果两段内存重叠,用memcpy函数可能会导致行为未定义。 而memmove函数能够避免这种问题,下面是一种实现方式,请补充代码。

#include <iostream>
using namespace std;
void* memmove(void* str1,const void* str2,size_t n)
{
    char* pStr1= (char*) str1;
    char* pStr2=(char*)str2;
    if  ( ) {
        for(size_t i=0;i!=n;++i){
            *(pStr1++)=*(pStr2++);
        }
    }
    else{
        pStr1+=n-1;
        pStr2+=n-1;
        for(size_t i=0;i!=n;++i){
            *(pStr1--)=*(pStr2--);
        }
    }
    return ( );
}
// g++ test.cpp

正确答案: A

pStr1< pStr2   str1

原型:void *memmove( void* dest, const void* src, size_t count );

头文件:<string.h>

功能:由src所指内存区域复制count个字节到dest所指内存区域。

如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。

结合高票答案的图:

pStr1< pStr2时,即 pStr1的首地址小于 pStr2的首地址(图1),正序拷贝

pStr1> pStr2时,即 pStr1的首地址大于 pStr2的首地址(图2),倒叙拷贝