面试题答案
一键面试1. 功能区别
memcpy()
:从源内存地址的起始位置开始拷贝指定长度的数据到目标内存地址。memmove()
:同样是从源内存地址拷贝指定长度的数据到目标内存地址,但它能处理源和目标内存区域重叠的情况。
2. 实现原理区别
memcpy()
:通常按字节直接拷贝。如果源和目标内存区域重叠,可能导致未定义行为,因为重叠部分的数据可能在拷贝过程中被覆盖。memmove()
:会先判断源和目标内存区域是否重叠。若重叠,会采用合适的方式进行拷贝(例如先将数据拷贝到临时区域,再从临时区域拷贝到目标区域),以确保数据正确拷贝。
3. 适用场景区别
memcpy()
:适用于源和目标内存区域不重叠的情况,因为其实现简单,效率相对较高。memmove()
:适用于源和目标内存区域可能重叠的情况,保证数据拷贝的正确性。
4. 代码示例
#include <stdio.h>
#include <string.h>
int main() {
char src[20] = "Hello, World!";
char dest[20];
// 使用 memcpy 进行拷贝,假设源和目标重叠
memcpy(dest, src, strlen(src) + 1);
printf("memcpy result: %s\n", dest);
// 模拟源和目标重叠的情况
char src_overlap[20] = "Hello, World!";
char *dest_overlap = src_overlap + 5;
// 使用 memcpy 处理重叠情况,可能导致未定义行为
memcpy(dest_overlap, src_overlap, strlen(src_overlap) - 5 + 1);
printf("memcpy with overlap: %s\n", src_overlap);
// 使用 memmove 处理重叠情况
char src_overlap2[20] = "Hello, World!";
char *dest_overlap2 = src_overlap2 + 5;
memmove(dest_overlap2, src_overlap2, strlen(src_overlap2) - 5 + 1);
printf("memmove with overlap: %s\n", src_overlap2);
return 0;
}
在上述代码中:
- 第一次使用
memcpy
拷贝正常数据,结果正确。 - 第二次使用
memcpy
处理重叠数据,由于memcpy
不保证重叠区域拷贝正确,结果可能不正确(未定义行为)。 - 使用
memmove
处理重叠数据,由于memmove
能正确处理重叠区域,结果正确。