memcpy函数
void * memcpy ( void * dst, const void * src, size_t count)
功能也是完成数组之间的拷贝
memcpy函数的实现如下
void* my_memcpy(void* dest, void* src, size_t num){
if (dest == NULL || src == NULL)
//参数校验
return dest;
char* pdest = (char*)dest;
char* psrc = (char*)src;
//类型强转,void是空指针,不能进行解引用
for (size_t i = 0; i < num; i++){
*pdest = *psrc;
++pdest;
++psrc;
}
return dest;
}
memcpy也有一个坑,就是缓冲区重叠,我在这里画了一张图方便理解

绿色区域为目标数组,此时拷贝后的值为{1,1,1,1}
这里我们就要讲一下缓冲区重叠的概念
目标缓冲区的起始位置如果在缓冲区之内,如果memcpy就会出错
目标缓冲区的起始位置如果在缓冲区之外,这时就不会出错

memmove函数就可以避免这种缓冲区重叠。
具体实现如下
void* my_memmove(void* dest, void* src, size_t num){
if (dest == NULL || src == NULL){
return dest;
}
char* pdest = (char*)dest;
char* psrc = (char*)src;
if ((pdest >= psrc)&&(pdest < psrc + num)){
//缓冲区重叠,从后往前拷贝
//位置指向后
pdest = pdest + num - 1;
psrc = psrc + num - 1;
for (size_t i = 0; i < num; i++){
*pdest = *psrc;
--pdest;
--psrc;
}
}
else{
for (size_t i = 0; i < num; i++){
*pdest = *psrc;
++pdest;
++psrc;
}
//不重叠
}
return dest;
}
int main(){
int arr[50] = { 1, 2, 3, 4 };
my_memmove(arr+1, arr, 16);
for (int i = 1; i <= 4; i++){
printf("%d\n", *(arr+i));
}
system("pause");
return 0;
}
让我们看一下结果

本文介绍了memcpy函数的功能,即数组间的拷贝,并通过示例解释了缓冲区重叠可能导致的问题。当出现缓冲区重叠时,使用memcpy可能会出错。为解决这一问题,文章提到了memmove函数,它可以安全地处理重叠缓冲区的拷贝。
628

被折叠的 条评论
为什么被折叠?



