关于C语言memcpy是否含缓冲区及重叠复制结果的疑问
memcpy处理重叠内存时的意外正确行为疑问
我知道不应使用memcpy处理重叠内存地址,这种场景下应该用memmove替代。
按照我对memcpy的理解,它会按顺序把源地址的每个字节复制到目标地址,复制指定的字节数。按这个逻辑,运行下面的代码:
int main(void){ int arr[] = {1, 2, 3, 0, 0}; memcpy(arr + 1, arr, 3 * sizeof(arr[0])); return 0; }
我预期的结果应该是arr = {1, 1, 1, 1, 0}——因为arr[0]被复制到下一个位置后,后续复制会用这个已经被篡改的值,最终前几个元素都会变成1。但实际运行后,输出却是arr = {1, 1, 2, 3, 0},元素像是被正确复制了。
我猜测memcpy内部可能用了某种缓冲区保存待复制的元素,避免后续复制时源值被篡改。为了验证是否存在类似固定大小的缓冲区(比如8字节),我又试了更长的数组:
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 0, 0, 0, 0, 0, 0, 0}; memcpy(arr + 8, arr, 16*sizeof(arr[0]));
结果依旧和预期的“错误复制”不一样,实际输出是arr = {1, 2, 3, 4, 5, 6, 7, 8, 1, 2, ..., 15, 16},元素还是被正确复制了。这到底是为什么?
内容的提问来源于stack exchange,提问作者eggsac
相关产品推荐
相关产品推荐

