MST

星途 面试题库

面试题:C++ 中 memcpy() 在内存重叠场景下的处理

在 C++ 中,已知有两个字符数组 src 和 dest,src 的内容为 "hello world",且 dest 起始位置在 src 偏移 3 个字符的位置(即内存有部分重叠),如果想用 memcpy() 将 src 中从第 5 个字符开始的 5 个字符复制到 dest 起始位置,应该如何正确操作?请写出代码示例并解释原因。
41.3万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
#include <iostream>
#include <cstring>

int main() {
    char src[] = "hello world";
    char* dest = &src[3];

    // 使用memmove而不是memcpy,因为memmove处理重叠内存更安全
    memmove(dest, &src[5], 5);

    std::cout << src << std::endl;

    return 0;
}

原因memcpy 函数不保证在源和目标内存区域重叠时能正确工作,而 memmove 函数可以正确处理重叠内存的情况。在本题中,dest 起始位置在 src 偏移 3 个字符的位置,存在内存重叠,所以应该使用 memmove 来确保复制操作的正确性。memmove 的第一个参数是目标地址,第二个参数是源地址,第三个参数是要复制的字节数。这里从 src 的第 5 个字符(即 src[5])开始复制 5 个字符到 dest(也就是 &src[3]) 。