C语言内存函数 memcpy,memmove函数的讲解

目录

一.memcpy函数

 1.函数定义:

2.函数参数:

3.函数注意事项:

4.函数实践 

4.模拟实现memcpy函数

二.memmove函数

1.定义:

2.函数实践

2.模拟实现memmove函数


一.memcpy函数

C语言内存函数 memcpy,memmove函数的讲解_第1张图片

 1.函数定义:

                                将一个数组的内容拷贝到另一个数组中。

        注:memcpy函数与strcpy函数的区别在于:memcpy函数可以拷贝任何类型的数据,而strcpy函数只限于字符串之间的拷贝。

2.函数参数:

        void *dest:被拷贝的指针(目的地指针)

        const void *src:要进行拷贝的指针(源头指针)

        size_t count:控制源头指针传输的字节数

        返回值类型为:void*

注:memcpy函数能够拷贝任何类型的数据都是源自于两个指针都是void*,void*按字面意思为:空类型指针,而深层意思是:泛型指针!

3.函数注意事项:

  • 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
  • 这个函数在遇到 '\0' 的时候并不会停下来。
  • 如果source和destination有任何的重叠,复制的结果都是未定义的。

4.函数实践 

以下代码为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个字节数。 

C语言内存函数 memcpy,memmove函数的讲解_第2张图片

 


以下代码为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中.

C语言内存函数 memcpy,memmove函数的讲解_第3张图片

 


4.模拟实现memcpy函数

//模拟实现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};

C语言内存函数 memcpy,memmove函数的讲解_第4张图片
 

所以说memcpy不能用来拷贝重叠数据,需要用到memmove函数


二.memmove函数

C语言内存函数 memcpy,memmove函数的讲解_第5张图片

 

1.定义:

用于内存拷贝的函数,没有类型限制,但是memmove使用要考虑内存重叠问题。 

它与memcpy作用相同,都是可以拷贝任何类型的数据,但多了一个内存重叠的作用。

2.函数实践

//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;
}

C语言内存函数 memcpy,memmove函数的讲解_第6张图片

2.模拟实现memmove函数

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内存拷贝(内存重叠)函数的讲解。

大家觉得有用的话就点个一键三连吧,谢谢!

你可能感兴趣的:(C语言知识点,c语言)