目录
一.memcpy函数
1.函数定义:
2.函数参数:
3.函数注意事项:
4.函数实践
4.模拟实现memcpy函数
二.memmove函数
1.定义:
2.函数实践
2.模拟实现memmove函数
将一个数组的内容拷贝到另一个数组中。
注:memcpy函数与strcpy函数的区别在于:memcpy函数可以拷贝任何类型的数据,而strcpy函数只限于字符串之间的拷贝。
void *dest:被拷贝的指针(目的地指针)
const void *src:要进行拷贝的指针(源头指针)
size_t count:控制源头指针传输的字节数
返回值类型为:void*
注:memcpy函数能够拷贝任何类型的数据都是源自于两个指针都是void*,void*按字面意思为:空类型指针,而深层意思是:泛型指针!
- 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
- 这个函数在遇到 '\0' 的时候并不会停下来。
- 如果source和destination有任何的重叠,复制的结果都是未定义的。
以下代码为memcpy函数对整型数组数据的拷贝:
int main() {
int arr[] = { 1,2,3,4,5,6,7 };
int arr2[10] = { 0 };
memcpy(arr2, arr, 28);
int i = 0;
int sz = sizeof(arr2) / sizeof(arr2[0]);
for (i = 0; i < sz; i++) {
printf("%d ", arr2[i]);
}
return 0;
}
注:控制传输的字节数时,1个int类型数据占4个字节,若是要将arr中的所有内容全拷贝到arr2中时,需要传4*7=28个字节数。
以下代码为memcpy函数对浮点型数组数据的拷贝:
//拷贝浮点型数据
float arr[] = { 1.0,2.0,3.0,4.0,5.0,6.0,7.0 };
float arr2[10] = { 0 };
memcpy(arr2, arr, 20);
int i = 0;
int sz = sizeof(arr2) / sizeof(arr2[0]);
for (i = 0; i < sz; i++) {
printf("%f ", arr2[i]);
}
注:一个浮点型占4字节,20/4=5个元素,也就是将arr中的5个浮点型数据拷贝到arr2中.
//模拟实现memcpy函数
void* my_memcpy(char* dest, const char* src, size_t num) {
assert(dest && src);
void* ret = dest;
while (num--) {
*dest = *src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
模拟实现的原理与strcpy函数的实现原理相同,但两个指针向后移动的次数需要加入字节数num的控制。
注:模拟实现的memcpy不能用来拷贝重叠数据
例:arr[]={1,2,3,4,5,6,7,8,9,10};用户想把1,2,3,4,5前5个数据的位置拷贝到第3,4,5,6,7的位置
成果:令arr[ ] ={1,2,1,2,3,4,5,8,9,10};
执行:memcpy(arr+2,arr,20);
会造成:arr[ ]={1,2,1,2,1,2,1,8,9,10};
所以说memcpy不能用来拷贝重叠数据,需要用到memmove函数
用于内存拷贝的函数,没有类型限制,但是memmove使用要考虑内存重叠问题。
它与memcpy作用相同,都是可以拷贝任何类型的数据,但多了一个内存重叠的作用。
//memmove函数
int main() {
int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//将arr1中的前20字节(5个元素)拷贝到arr1数组的第3个位置开始
//原arr1: 1,2,3,4,5,6,7,8,9,10
//改成: 1,2,1,2,3,4,5,8,9,10
memmove(arr1 + 2, arr1, 20);//1 2 1 2 3 4 5 8 9 10
int i = 0;
for (i = 0; i < 10; i++) {
printf("%d ", arr1[i]);
}
return 0;
}
void* my_memmove(char* dest, const char* src, size_t num) {
assert(dest && src);
void* ret = dest;
//从前往后
if (dest < src) {
while (num--) {
*dest = *src;
(char*)dest = (char*)dest + 1;
(char*)src = (char*)src + 1;
}
}
//从后往前
else {
while (num--) {
*((char*)dest+num) = *((char*)src+num);
}
}
return ret;
}
以上是我对memcpy内存拷贝函数、memmove内存拷贝(内存重叠)函数的讲解。
大家觉得有用的话就点个一键三连吧,谢谢!